$@ в псевдониме внутри скрипта: есть ли "локальный" $@?

Вот вариант, совместимый с POSIX, без использования циклов. Элементы в file-list.txtразделяются символами новой строки.

cd A ; xargs -I{} -- mv -- {} B < file-list.txt

Очевидно, что этот вариант не позволяет использовать имена файлов, содержащие символы новой строки. Кроме того, он вызывает команду mvдля каждого файла отдельно.

Вариант Дэвида Ферстера использует расширения GNU xargsи mv. Он будет вызывать один экземпляр mvдля нескольких аргументов и будет более эффективным для длинных списков файлов. Он по-прежнему не разрешает имена файлов, содержащие символы новой строки. Чтобы обойти это ограничение, вы можете использовать опцию -0и разделять имена файлов символами\0(NULL ).

cd A ; xargs -r0 -- mv -t B -- < file-list.txt

0
15.08.2019, 22:36
1 ответ

Псевдонимы определяют способ замены маркера оболочки некоторой строкой перед тем, как событие оболочки попытается проанализировать код. Это не структура программирования, как функция.

В

alias pushd='pushd "$@" > /dev/null'

, а затем:

pushd.

Происходит то, что pushdзаменяется на pushd "$@" > /dev/null, а затем анализируется результат. Таким образом, оболочка завершает синтаксический анализ:

pushd "$@" > /dev/null.

Перенаправления могут появляться в любом месте командной строки, так что это точно так же, как:

pushd "$@". > /dev/null

или

> /dev/null pushd "$@".

Когда вы запускаете это из командной строки, "$@"— это список аргументов, полученных вашей оболочкой, поэтому, если вы не запустили set arg1 arg2, он, вероятно, будет пустым, поэтому он будет таким же, как

pushd. > /dev/null

Но внутри функции эти "$@"будут аргументами функции.

Здесь,вы либо хотите определить pushdкак функцию типа:

pushd() { command pushd "$@" > /dev/null; }

Или псевдоним типа:

alias pushd='> /dev/null pushd'

или

alias pushd='pushd > /dev/null
5
28.04.2021, 23:30

Теги

Похожие вопросы