PATH = $ PATH: 'pwd' - O que acontece quando este comando é executado?

4

O que acontece quando este comando é executado?

PATH =$PATH:'pwd'

Erro: Nada acontece quando executo o comando no terminal.

    
por Sergiy Kolodyazhnyy 19.05.2018 / 17:59

2 respostas

14

Se você executar o comando em sua pergunta, deverá receber uma mensagem de erro:

$ PATH =$PATH:'pwd'
bash: PATH: command not found

Se o espaço for um erro de digitação e você realmente executar isso:

PATH=$PATH:'pwd'

Em seguida, isso adicionará o diretório atual ( pwd é um comando que imprime o caminho do diretório atual e 'pwd' será substituído pela saída de pwd ) para a variável PATH durante a duração da sua sessão atual do shell (util você fecha o terminal). Para ilustrar:

$ pwd
/home/terdon/foo  ## I am in /home/terdon/foo

$ echo $PATH ## the current PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ PATH=$PATH:'pwd'
$ echo $PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/terdon/foo

Observe como o diretório atual, /home/terdon/foo foi adicionado ao final da variável PATH .

    
por terdon 19.05.2018 / 18:08
2

O erro

No que diz respeito ao seu comando original, a resposta de terdon já cobre muito bem o que está acontecendo e o que deve acontecer. Vamos analisar isso um pouco mais detalhadamente.

O que você está tentando fazer é atribuição de variável, que deve tomar a forma de:

varName=value

No entanto, devido ao espaço, isso é tratado como um comando PATH com argumento de linha de comando que consiste em = , em seguida, conteúdo da variável $PATH e substituição de comando de pwd , todos unidos na mesma sequência :

PATH =$PATH:'pwd'

Naturalmente, não existe tal comando como PATH , portanto, você receberá um erro.

O Shell trata os comandos simples e seus argumentos como uma lista de um ou mais tokens separados por espaço (talvez com atribuição de variável opcional antes disso). Em outras palavras, o formulário deve ser:

[VAR=value] word [arg1 [arg2 [arg3] ]...]

Claro, isso não é o desejado neste caso.

O comando adequado

Então o que deveria ter sido feito é este:

PATH=$PATH:'pwd'    

Aqui temos uma atribuição de variável adequada, onde, de acordo com expansão order , bash shell primeiro executaria a expansão de variável, ou seja, substitua $PATH pelo que você tem nessa variável atualmente, execute a substituição de comando em que ela executa pwd e substitui pela saída de pwd . No final, tudo o que é atribuído de volta à variável PATH .

Algumas observações importantes:

  • Como isso é atribuição de variável, não é necessário citar a variável $PATH , mas normalmente você deve evitar um comportamento indesejável. Consulte Quando é necessário duplicar a cotação
  • A forma de
  • backticks de substituições de comandos não é recomendada atualmente . Neste caso em particular, tudo bem, mas em geral os backticks não se prestam muito bem a comandos de aninhamento e multi-linhas.
  • A variável PATH é usada pelo shell para encontrar comandos, e a ordem dos diretórios nessa lista define a precedência para onde os comandos seriam procurados. Assim, por exemplo, quando você executa um comando, o shell primeiro verifica se o comando é built-in , se não for, então olharia através de todos os diretórios na variável PATH . O PATH=$PATH:$(pwd) faria com que o shell percorresse todo o resto e só então chegasse ao diretório que foi dado por pwd . Por contraste, PATH=$(pwd):$PATH iniciaria a pesquisa no diretório retornado por pwd first. Então, a ordem da tarefa é importante.
por Sergiy Kolodyazhnyy 19.05.2018 / 21:09