substituição de comandos dentro de aspas simples para alias

6

Aspas duplas são necessárias no bash para a substituição de comandos:

$ echo "$(date)"
Fri Oct 28 19:16:40 EDT 2016

Considerando que aspas simples não fazem substituição de comando:

$ echo '$(date)'
$(date)

… por que, então, vejo o seguinte comportamento com alias que parece sugerir que a substituição de comandos aconteceu com aspas simples?

alias d='$(date)'
$ d
No command 'Fri' found, did you mean:
   ....
    
por Marcus Junius Brutus 29.10.2016 / 01:24

2 respostas

4

Versões entre aspas simples e aspas duplas

Vamos definir o alias usando aspas simples:

$ alias d='$(date)'

Agora, vamos recuperar a definição do alias:

$ alias d
alias d='$(date)'

Observe que nenhuma substituição de comando foi executada.

Vamos fazer o mesmo, mas desta vez com aspas duplas:

$ alias d="$(date)"
$ alias d
alias d='Fri Oct 28 17:01:12 PDT 2016'

Como aspas duplas são usadas, a substituição de comandos foi executada antes que o alias fosse definido.

Versão de cotação única

Vamos tentar executar a versão com aspas simples:

$ alias d='$(date)'
$ d
bash: Fri: command not found

A versão com aspas simples é equivalente à execução:

$ $(date)
bash: Fri: command not found

Em ambos os casos, a substituição do comando é executada quando o comando é executado.

Uma variação

Vamos considerar esse alias que usa a substituição de comando e é definido usando aspas simples:

$ alias e='echo $(date)'
$ e
Fri Oct 28 17:05:29 PDT 2016
$ e
Fri Oct 28 17:05:35 PDT 2016

Sempre que executamos esse comando, date é avaliado novamente. Com aspas simples, a substituição do comando é executada quando o alias é executado, não quando é definido.

    
por 29.10.2016 / 02:03
5

Se você usar aspas duplas ao definir um alias, a expansão do parâmetro ocorrerá na definição alias time .

Por exemplo:

$ pwd
/tmp
$ echo $PWD
/tmp
$ alias p="echo $PWD"
$ p
/tmp
$ cd /
$ pwd
/
$ p
/tmp
$ alias p
alias p='echo /tmp'
$ 

Se você quiser que a expansão de parâmetro ocorra no momento em que você chamar o alias, use aspas simples ao definir o alias:

$ alias p='echo $PWD'
$ p
/tmp
$ cd /
$ p
/
$ 

Claro que nunca há nenhuma razão para executar o comando echo "$(date)" . Eu sei que você usou isso apenas como um exemplo, mas desde que eu vi isso tantas vezes "em estado selvagem" eu vou esclarecer de qualquer maneira: O que isto significa é, executar o comando date e capturar a saída (retirando qualquer trailing novas linhas). Em seguida, passe a saída capturada como um argumento para o comando echo , que será impresso junto com uma nova linha à direita. Não há vantagem alguma em executar apenas date diretamente.

No entanto, você também está tendo um problema diferente:

Quando você definir o alias d='$(date)' , quando digitar d , obterá o resultado literal de digitar $(date) na linha de comando - o comando date será executado, a saída capturada, a nova linha à direita será removido e, em seguida, a saída será analisada como um comando pelo shell (incluindo a divisão de palavras e a expansão do glob de arquivos).

Já que é sexta-feira, a primeira palavra produzida por date é "Fri", então o shell tenta executar isso como um comando.

Se o que você quer é ver a data em que você digita d , use:

alias d=date

ou

alias d='date'

ou

alias d="date"

Não importa qual formulário você usa, pois não há caracteres especiais que exijam qualquer forma de cotação.

    
por 29.10.2016 / 02:03