отложить аргумент в «псевдониме» в .bashrc

Я немой пользователь, который работает с LINUX (ubuntu 14). Недавно приобретенный ноутбук заставляет меня использовать оболочку bash , и у нее есть .bashrc . Раньше я использовал C-shell и пытался скопировать его псевдонимы из .cshrc в .bashrc с некоторым очевидным редактированием.

Одно дело не работает – отложенный аргумент. В качестве примера – моя команда .cshrc :

 alias rm 'mv -f \!* $HOME/zap' 

когда написано в .bshrc as

 alias rm = 'mv -f \!* $HOME/zap' 

генерирует сообщение об ошибке:

 bash:alias: rm: not found bash:alias: mv -f \!* $HOME/zap: not found 

(каталог zap был создан мной заранее)

Что я должен использовать вместо \!* ?

В этих случаях вы должны использовать функции оболочки вместо псевдонимов. Это немного больше, чтобы напечатать, но это позволяет вам быть более гибкими:

 function rm { if ! test -d "$HOME/zap"; then echo "No zap in home" >&2 return 1 else mv -f -- "$@" "$HOME/zap/" fi } 

$@ Будет расширяться до аргументов, которые вы даете rm в командной строке. The -- необходимо сигнализировать о завершении флагов командной строки (так что rm -f , где -f – это файл, возможно, rm и mv не используют много флагов командной строки).

Для доступа к исходной команде rm команду \rm или command rm .

Тестирование на существование $HOME/zap , вывод сообщения об ошибке в стандартную ошибку и выход с ненулевым статусом выхода в функции – это просто показать, что вы можете делать все, что захотите. Вы, очевидно, могли бы

 function rm { mv -f -- "$@" "$HOME/zap/" } 

В руководстве bash содержится утверждение:

Для почти всех целей псевдонимы заменяются функциями оболочки.

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

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

 $ alias rm='mv -f \!* $HOME/zap' 

Позволяет просто добавить эхо, чтобы «видеть», что происходит без перемещения файлов:

 $ alias rm='echo mv -f \!* $HOME/zap' $ rm one two three mv -f !* /home/immf/zap one two three 

Это просто показывает, что история bash не работает так же, как и команды истории csh, поскольку использование csh:

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

и bash этого не делает. Более того, алиасы bash имеют следующие ограничения:

Механизм использования аргументов в заменяющем тексте отсутствует. Если нужны аргументы, следует использовать функцию оболочки.

Псевдонимы не расширяются, когда оболочка не является интерактивной.

То есть: нет способа повторно использовать аргументы в текущей строке, и даже больше, псевдонимы не работают в сценариях (по умолчанию).

Однако целью псевдонима является повторное использование тех же аргументов и добавление последнего каталога в качестве цели для перемещения файлов:

 $ alias rm 'echo mv -f \!* $HOME/zap' ### in csh $ rm one two 333 ### in csh mv -f one two 333 /home/user/zap 

Что можно легко сделать с помощью опции -t mv (недоступно в ms bsd):

 $ alias rm='echo mv -f -t "$HOME/zap"' $ rm one two 333 mv -f -t /home/user/zap one two 333 

Короче: было бы разумно использовать функцию.