Eu tenho um pequeno script que escrevi que me permite mudar para o diretório de um script que está no caminho, o que me ajuda a acessar rapidamente outros scripts que costumo querer editar, na mesma pasta do script original.
Eu costumo fazer isso voltando na história e prefixando esse comando, não importa o que fosse, assim
$ . cdbin my_super_script
Isso funciona na maioria das vezes - mas - não funciona quando o último comando que eu estava executando estava sendo canalizado para algum lugar,
por exemplo
# if my last command was the following
$ my_super_script | grep -v bad | grep good
# then when I try and run my cdbin script using history, it looks like this
$ . cdbin my_super_script | grep -v bad | grep good
e isso simplesmente não faz nada - sem erros, apenas me deixa no meu diretório atual.
Aqui está meu cdbin
script simples:
cdbin
PROG=$(which "$1")
DIR=$(dirname "$PROG")
cd "$DIR"
EDIT: Observe que estou ciente de que poderia simplesmente digitar algo como o seguinte na maioria das vezes para evitar isso, por exemplo, $ . cdbin !:0
mas acho um toque estranho digitar: D
Quando você executa isso com um pipeline, seu
. cdbin
comando é executado em um subshell : portanto, ele altera os diretórios no subshell e o efeito é perdido quando o subshell é fechado.Para evitar isso, já que você está interessado apenas no comando que executou anteriormente, use o histórico:
Isso extrairá a primeira palavra do comando anterior , então no seu cenário você acabaria com
Você pode usar
fc
em vez disso para extrair o comando anterior:Isso pode ser transformado em um alias para simplificar o uso ou fazer parte de
cdbin
si mesmo, por exemplo, se for invocado sem argumentos: