Передача аргумента псевдониму в bash [дублировать]
-
27-09-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
Можно ли сделать следующее:
Я хочу запустить следующее:
mongodb bin/mongod
В моем bash_profile у меня есть
alias = "./path/to/mongodb/$1"
Решение
Псевдоним будет расширяться в строку, которую он представляет. Что-то после того, как псевдоним появится после его расширения без необходимости быть или возможность передаваться как явные аргументы (например, $1
).
$ alias foo='/path/to/bar'
$ foo some args
будет расширен до
$ /path/to/bar some args
Если вы хотите использовать явные аргументы, вам нужно использовать функцию
$ foo () { /path/to/bar "$@" fixed args; }
$ foo abc 123
будет выполнен, как если бы вы сделали
$ /path/to/bar abc 123 fixed args
Чтобы неофинировать псевдоним:
unalias foo
Чтобы неофинировать функцию:
unset -f foo
Чтобы увидеть тип и определение (для каждого определенного псевдонима, ключевого слова, функции, встроенного или исполняемого файла):
type -a foo
Или тип только (для возникновения высочайшего приоритета):
type -t foo
Другие советы
Обычно, когда я хочу пройти аргументы на псевдоним в Bash, я использую комбинацию псевдонима и функции, подобную этой, например,
function __t2d {
if [ "$1x" != 'x' ]; then
date -d "@$1"
fi
}
alias t2d='__t2d'
чтобы использовать параметры в псевдонимах, я использую этот метод:
alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias'
это саморазрушающаяся функция, завернутая в псевдоним, так что она в значительной степени является лучшей из обоих миров и не занимает лишних строк в ваших определениях...что я ненавижу, о да, и если вам нужно это возвращаемое значение, вам придется сохранить его перед вызовом unset, а затем вернуть значение, используя ключевое слово "return" в этой саморазрушающейся функции:
alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias'
итак..
вы могли бы, если вам нужно, чтобы эта переменная была там
alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb'
конечно...
alias mongodb='./path/to/mongodb/'
на самом деле это сделало бы то же самое без необходимости в параметрах, но, как я уже сказал, если вы хотели или нуждались в них по какой-то причине (например, вам нужно было $ 2 вместо $ 1), вам нужно было бы использовать подобную оболочку.Если он больше одной строки, вы могли бы подумать о том, чтобы просто написать функцию напрямую, поскольку по мере увеличения она становилась все более неприятной для глаз.Функции великолепны, поскольку вы получаете все привилегии, которые дают функции (смотрите "Завершение", "Ловушки", "привязка" и т.д. О преимуществах, которые могут предоставить функции, на странице руководства bash).
Я надеюсь, что это поможет вам :)
Это решение, которое может избежать использования функции:
alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<'
результат испытаний
addone 200
input: 200
result:201
В CSH (в отличие от башмак) Вы можете сделать именно то, что вы хотите.
alias print 'lpr \!^ -Pps5'
print memo.txt
Обозначения \!^
заставляет аргумент быть вставленным в команду на данный момент.
То !
персонаж предшествует \
Чтобы предотвратить интерпретацию как команду истории.
Вы также можете передавать несколько аргументов:
alias print 'lpr \!* -Pps5'
print part1.ps glossary.ps figure.ps
(Примеры, взятые из http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html. .)
Чтобы упростить ответ LEED25D, используйте комбинацию псевдонима и функции. Например:
function __GetIt {
cp ./path/to/stuff/$* .
}
alias GetIt='__GetIt'