substituição de comando entre aspas simples para alias

substituição de comando entre aspas simples para alias

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

$ 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 aliasque parece sugerir que a substituição de comando aconteceu com aspas simples?

alias d='$(date)'
$ d
No command 'Fri' found, did you mean:
   ....

Responder1

Versões com 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 realizada ainda.

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 são usadas aspas duplas, a substituição do comando foi executada antes da definição do alias.

Versão com aspas simples

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 a executar:

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

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

Uma variação

Vamos considerar este alias que usa substituição de comando e é definido com aspas simples:

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

Cada vez que executamos este comando, dateele é avaliado novamente. Com aspas simples, a substituição do comando é executada quando o alias é executado, não quando ele é definido.

Responder2

Se você usar aspas duplas ao definir um alias, a expansão do parâmetro ocorre nodefinição de aliastempo.

Por exemplo:

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

Se desejar que a expansão do parâmetro ocorra no momento em que vocêchamaro alias, use aspas simples ao definir o alias:

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

Claro que nunca háqualquermotivo para executar o comando echo "$(date)". Eu sei que você usou isso apenas como exemplo, mas como já vi isso tantas vezes "na natureza", vou esclarecer de qualquer maneira: o que isso significa é executar o datecomando e capturar a saída (removendo quaisquer novas linhas finais). Em seguida, passe a saída capturada como argumento para o echocomando, que a imprimirá, junto com uma única nova linha final. Não há nenhuma vantagem em apenas executar datediretamente.

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

Ao definir o alias d='$(date)', ao digitar, dvocê obterá o resultado literal da digitação $(date)na linha de comando - o datecomando será executado, a saída capturada, a nova linha final será removida e a saída será analisada como um comando por o shell (incluindo divisão de palavras e expansão de arquivo glob).

Como é sexta-feira, a primeira palavra emitida dateé "Fri", então o shell tenta executar isso como um comando.

Se o que você quer évera data quando você digita d, basta usar:

alias d=date

ou

alias d='date'

ou

alias d="date"

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

Responder3

Isso está acontecendo ~/.bashrc? Há uma parte comentada no~/.bashrc

    95 # Alias definitions.                                              
    96 # You may want to put all your additions into a separate file like
    97 # ~/.bash_aliases, instead of adding them here directly.          
    98 # See /usr/share/doc/bash-doc/examples in the bash-doc package.   

e é por isso que uso outro arquivo sugerido para meus atalhos:

o~/.bash_aliases

A chave é escapar da aspa simples:

# I use vim but nano or gedit is also fine
vim ~/.bashrc # or vim ~/.bash_aliases
# create your alias:
alias d=''\'date''\'
# or
alias dd="'date'"
# or
alias ddd='"date"'

Em seguida, abra uma nova sessão de terminal e dexecute o que desejar.

informação relacionada