Почему псевдоним foo1 = "echo $ 1" и псевдоним foo2 = "echo '$ 1'" ведут себя так же, как они? - PullRequest
0 голосов
/ 25 июня 2018

В моем файле .bashrc я помещаю следующие две строки:

alias foo1="echo $1"
alias foo2="echo '$1'"

Затем в терминале я получаю следующий вывод:

$ foo1 hello world
hello world
$ foo2 hello world
 hello world

Почемудополнительное пространство, создаваемое foo2?

Если я просто сделаю в терминале следующее, выходные данные будут такими, как показано:

$ echo hello world
hello world
$ echo 'hello world'
hello world

Это заставляет меня думать, что foo1 и foo2 должен делать то же самое.Почему они на самом деле не выводят точно одно и то же, и почему они отличаются просто одним пробелом?

(Кроме того, почему любой из них выводит world? Я ожидаю, что только первый аргументбыть выведен.)

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Если в типичной интерактивной оболочке вы запускаете:

$ set --             # this clears the argument list; it's empty by default, but make sure.
$ alias foo1="echo $1"
$ alias foo2="echo '$1'"
$ alias -p 

Вывод alias -p выглядит следующим образом:

$ alias -p
alias foo1='echo '
alias foo2='echo '\'''\'''

В частности, $1 sвообще отсутствует - поскольку вы определили псевдоним в строке в двойных кавычках, они были заменены текущим значением $1 - значением, присутствующим в контексте текущей оболочки, которое для интерактивной оболочки будет пустымпри запуске.


Таким образом, когда вы запускаете:

foo2 hello world

..., что вызывает оболочка:

echo '' hello world

Поскольку echo ставитпробелы между аргументами выводятся как:

 hello world

Принимая во внимание, что если вы запустите:

foo1 hello world

... то, что вызывает оболочка:

echo hello world

... потому что, как вы можете видеть из псевдонима foo1, испускаемого alias -p, нет записей о не цитируемых $1 слева;оно было заменено его текущим значением - пустой строкой - во время определения.

0 голосов
/ 25 июня 2018

псевдонимы не принимают позиционные аргументы. $1 будет ничего не содержать в псевдониме. foo2 буквально добавляет то, что вы ввели после foo2, к пустой строке '', которая включает пробел после foo2. foo1 не добавляется ни к чему, поскольку $1 ничего не оценивает, поэтому пробел не отображается.

...