Для подстановки команд в bash требуются двойные кавычки:
$ echo "$(date)"
Fri Oct 28 19:16:40 EDT 2016
В то время как одинарные кавычки не выполняют подстановку команд:
$ echo '$(date)'
$(date)
… почему тогда я вижу следующее поведение, alias
которое, по-видимому, предполагает, что подстановка команд произошла с одинарными кавычками?
alias d='$(date)'
$ d
No command 'Fri' found, did you mean:
....
решение1
Версии с одинарными и двойными кавычками
Давайте определим псевдоним, используя одинарные кавычки:
$ alias d='$(date)'
Теперь давайте восстановим определение псевдонима:
$ alias d
alias d='$(date)'
Обратите внимание, что замена команд еще не производилась.
Давайте сделаем то же самое, но на этот раз с двойными кавычками:
$ alias d="$(date)"
$ alias d
alias d='Fri Oct 28 17:01:12 PDT 2016'
Поскольку используются двойные кавычки, подстановка команд была выполнена до определения псевдонима.
Версия с одинарными кавычками
Давайте попробуем выполнить версию с одинарными кавычками:
$ alias d='$(date)'
$ d
bash: Fri: command not found
Версия с одинарными кавычками эквивалентна выполнению:
$ $(date)
bash: Fri: command not found
В обоих случаях подстановка команды осуществляется при ее выполнении.
Вариация
Рассмотрим этот псевдоним, который использует подстановку команд и определяется с помощью одинарных кавычек:
$ alias e='echo $(date)'
$ e
Fri Oct 28 17:05:29 PDT 2016
$ e
Fri Oct 28 17:05:35 PDT 2016
Каждый раз, когда мы запускаем эту команду, date
оценивается снова. С одинарными кавычками подстановка команды выполняется при выполнении псевдонима, а не при его определении.
решение2
Если при определении псевдонима вы используете двойные кавычки, расширение параметра происходит вопределение псевдонимавремя.
Например:
$ pwd
/tmp
$ echo $PWD
/tmp
$ alias p="echo $PWD"
$ p
/tmp
$ cd /
$ pwd
/
$ p
/tmp
$ alias p
alias p='echo /tmp'
$
Если вы хотите, чтобы расширение параметра произошло в то время, когда вывызовпсевдоним, используйте одинарные кавычки при определении псевдонима:
$ alias p='echo $PWD'
$ p
/tmp
$ cd /
$ p
/
$
Конечно, никогда не бываетлюбойпричина запустить команду . Я знаю, что вы использовали это просто как пример, но поскольку я видел это так много раз «в дикой природе», я все равно объясню: это означает, что нужно запустить команду echo "$(date)"
date
и захватить вывод (удалив все завершающие символы новой строки). Затем передать этот захваченный вывод в качестве аргумента команде echo
, которая выведет его вместе с одним завершающим символом новой строки. Нет никаких преимуществ по сравнению с простым запуском date
напрямую.
Однако у вас здесь также есть другая проблема:
Если вы зададите псевдоним d='$(date)'
, то при вводе d
вы получите буквальный результат ввода $(date)
в командной строке — date
команда будет выполнена, вывод будет захвачен, завершающий символ новой строки будет удален, а затем вывод будет проанализирован оболочкой как команда (включая разбиение на слова и расширение шаблона файла).
Поскольку сегодня пятница, первое выведенное слово date
— «Пт», поэтому оболочка пытается выполнить это как команду.
Если то, что вы хотите, этовидетькогда вы вводите дату d
, просто используйте:
alias d=date
или
alias d='date'
или
alias d="date"
Неважно, какую форму вы используете, поскольку нет специальных символов, требующих какой-либо формы кавычек.
решение3
Это происходит ~/.bashrc
? В этом есть прокомментированная часть~/.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.
и вот почему я использую другой, рекомендуемый файл для своих ярлыков:
the ~/.bash_aliases
Главное — экранировать одинарную кавычку:
# 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"'
Затем откройте новый сеанс терминала и d
выполните то, что вам нужно.