Прямой ответ на ваш вопрос: удача, что первый случай соответствует тому, что вы ожидаете.
Вы написали свои псевдонимы, предполагая, что $ 1 будет представлять первый «аргумент» для вашего псевдонима. На самом деле, псевдонимы в bash не принимают аргументы, они просто заменяют текст псевдонима содержимым в кавычках, которые вы ему присвоили. Так что же на самом деле делают ваши 1 доллар?
Отдельно от псевдонимов, в bash, $0
распространяется на первое, что вводится как сценарий или оболочка, в которой вы находитесь (команда). $1
- первый аргумент (или второй набранный предмет). Поскольку вы вводите командную строку в командной строке, скорее всего, ваша оболочка была запущена терминалом или оконным менеджером, который запускал команду bash
без аргументов.
Попробуйте это из командной строки:
$ echo $0
bash
$ echo $1
# prints nothing
Итак, в вашем первом случае,
<strong>foo</strong> /etc
расширяет Foo, чтобы получить
<strong>ls -1 $1</strong> /etc
и поскольку $ 1 равен нулю,
<strong>ls -1</strong> /etc
также, если вы добавите | tail
к конвейеру, он будет работать нормально.
В вашем втором случае
<strong>foo</strong> /etc
расширяет Foo, чтобы получить
<strong>ls -1 $1 | tail</strong> /etc
и так как $ 1 равен нулю,
<strong>ls -1 | tail</strong> /etc
, которая выдает эту ошибку, которую вы получили, потому что команда после канала содержит ошибку: tail
не может работать с каталогом /etc