Сделать псевдоним Bash, который принимает параметр? - PullRequest
1078 голосов
/ 20 августа 2011

Я использовал CShell (), который позволяет создавать псевдоним, который принимает параметр.Запись была что-то вроде

alias junk="mv \\!* ~/.Trash"

В Bash, похоже, это не работает.Учитывая, что Bash обладает множеством полезных функций, я предполагаю, что эта функция была реализована, но мне интересно, как.

Ответы [ 13 ]

2 голосов
/ 28 июля 2016

Для получения параметров вы должны использовать функции!

Однако $ @ интерпретируется при создании псевдонима, а не во время выполнения псевдонима и экранирования $ также не работает.Как мне решить эту проблему?

Вам нужно использовать функцию оболочки вместо псевдонима, чтобы избавиться от этой проблемы.Вы можете определить foo следующим образом:

function foo() { /path/to/command "$@" ;}

ИЛИ

foo() { /path/to/command "$@" ;}

Наконец, вызовите вашу функцию foo (), используя следующий синтаксис:

foo arg1 arg2 argN

Убедитесь, что выдобавьте ваш foo () в файл ~/.bash_profile или ~/.zshrc.

В вашем случае это будет работать

function trash() { mv $@ ~/.Trash; }
1 голос
/ 10 декабря 2018

Хотя функция обычно является хорошим выбором, как говорили здесь другие.Но я хотел бы отметить, что есть случаи, когда функция не работает и псевдоним делает, или другие случаи, сценарий-оболочка - лучший выбор.

псевдоним работает, функция не работаети еще можно передавать параметры.

Например: я хочу создать ярлык для активации conda и создать среду conda в одной команде.Было бы соблазн сделать это:

function conda_activate(){
    export PATH="$PATH:/path/to/conda"
    envname=$1
    if [ "x$envname" -ne "x" ]; then
       source activate "$envname"
    fi
}

Это не работает, как задумано.Если один бежал conda_activate myenv.Команда source выполняет поиск, но немедленно завершает работу, и у запущенной оболочки нет среды.

Рабочее решение выглядит следующим образом:

function conda_activate(){
    export PATH="$PATH:/path/to/conda"
    # do some other things
}
alias conda_env='conda_activate; source activate'
# usage example
conda_env myenv

скрипт-оберткалучший выбор

Мне случалось несколько раз, что псевдоним или функция не могут быть найдены при входе в систему через ssh или при переключении имен пользователей или многопользовательской среде.Существуют советы и рекомендации по работе с файлами точек поиска, например, этот интересный: alias sd='sudo ' позволяет этому alias install='sd apt-get install' работать как положено.Обратите внимание на дополнительный пробел в sd='sudo '.Но когда вы сомневаетесь, скрипт-обертка всегда является наиболее надежным и переносимым решением.

0 голосов
/ 19 марта 2016

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

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

alias ssh_disc='ssh -O stop'

позволяет мне печатать что-то вроде ssh_disc myhost, которое расширяется, как ожидается: ssh -O stop myhost

Это может быть полезно для команд, которые принимают сложные аргументы (моя память уже не та, что используется) ...

...