подстановка команды в одинарных кавычках для псевдонима

подстановка команды в одинарных кавычках для псевдонима

Для подстановки команд в 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выполните то, что вам нужно.

Связанный контент