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 alias
que 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, date
ele é 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 . 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 echo "$(date)"
date
comando e capturar a saída (removendo quaisquer novas linhas finais). Em seguida, passe a saída capturada como argumento para o echo
comando, que a imprimirá, junto com uma única nova linha final. Não há nenhuma vantagem em apenas executar date
diretamente.
No entanto, você também está tendo um problema diferente aqui:
Ao definir o alias d='$(date)'
, ao digitar, d
você obterá o resultado literal da digitação $(date)
na linha de comando - o date
comando 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 d
execute o que desejar.