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

sed -r -i '
/([0-9]{4})-([[:alpha:]]{3})-([0-9]{2})/ {
    s#([0-9]{4})-Jan-([0-9]{2})#\2/01/\1#g
    s#([0-9]{4})-Feb-([0-9]{2})#\2/02/\1#g
    s#([0-9]{4})-Mar-([0-9]{2})#\2/03/\1#g
    s#([0-9]{4})-Apr-([0-9]{2})#\2/04/\1#g
    s#([0-9]{4})-May-([0-9]{2})#\2/05/\1#g
    s#([0-9]{4})-Jun-([0-9]{2})#\2/06/\1#g
    s#([0-9]{4})-Jul-([0-9]{2})#\2/07/\1#g
    s#([0-9]{4})-Aug-([0-9]{2})#\2/08/\1#g
    s#([0-9]{4})-Sep-([0-9]{2})#\2/09/\1#g
    s#([0-9]{4})-Oct-([0-9]{2})#\2/10/\1#g
    s#([0-9]{4})-Nov-([0-9]{2})#\2/11/\1#g
    s#([0-9]{4})-Dec-([0-9]{2})#\2/12/\1#g
}
s#([0-9]{4})-([0-9]{2})-([0-9]{2})#\3/\2/\1#g
' file
1
27.01.2019, 02:10
2 ответа

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

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

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

Чтобы получить доступ к исходной команде rm , используйте \ rm или команду rm .

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

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

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

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

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

1
27.01.2020, 23:35

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

$ 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 (недоступен в bsd mv ):

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

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

1
27.01.2020, 23:35

Теги

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