Передача аргумента псевдониму в bash

Можно ли сделать следующее:

Я хочу запустить следующее:

mongodb bin/mongod

В моем bash_profile у меня есть

alias = "./path/to/mongodb/$1"

person slik    schedule 30.10.2010    source источник


Ответы (6)


Псевдоним будет расширяться до строки, которую он представляет. Все, что следует за псевдонимом, появится после его расширения без необходимости или возможности передачи в качестве явных аргументов (например, $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
person Dennis Williamson    schedule 30.10.2010
comment
Просто хочу добавить пример из моего .bashrc mkcd() { mkdir $@ && cd $@; } где я создаю каталог и перехожу в него - person Vova Lando; 30.12.2013
comment
Вы также должны покрасить abc в красный цвет, так как $@ = список аргументов, переданных функции. - person thdoan; 07.07.2014
comment
@ 10basetom: Если вы имеете в виду цвета в моем ответе, это делается автоматически с помощью подсветки синтаксиса. - person Dennis Williamson; 07.07.2014
comment
После добавления функции foo() {....} как ее удалить? - person shinobi; 13.07.2016
comment
@шиноби: unset -f foo - person Dennis Williamson; 13.07.2016
comment
Что, если я хочу получить такой вывод: «$ /path/to/bar/abc/123 fixed args»? Как я могу это сделать? - person Mymozaaa; 19.07.2017
comment
@Mymozaaa: Непонятно, что вы хотите делать. Вы хотите передать имя каталога и имя файла исполняемого файла в качестве аргументов? - person Dennis Williamson; 19.07.2017
comment
@ Деннис Уильямсон Да! В конечном счете, я хочу передать в качестве аргумента только имя файла. Мне сказали, что это невозможно с псевдонимом, и что вместо этого я должен использовать сценарий bash. Это правильно? - person Mymozaaa; 19.07.2017
comment
Я думаю, вы можете добавить каталог своего исполняемого файла в свой PATH: PATH=$PATH:/path/to/bar, тогда вы сможете запустить исполняемый файл с именем 123 (и аргументы) без указания каталога. Или просто указывайте полный каталог (и аргументы) /path/to/bar/abc/123 fixed args каждый раз. См. BashFAQ/50, чтобы узнать, почему вы не должны делать то, что, по вашему мнению, хотите. . - person Dennis Williamson; 20.07.2017
comment
Вам просто нужно объявить функцию в вашем .bash_profile или .zshrc, ничего больше не делая. Например: добавьте строку foo() { echo $1 } в свой файл профиля, а затем вы можете вызвать foo прямо в своей оболочке. - person acrazing; 17.12.2018

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

function __t2d {                                                                
         if [ "$1x" != 'x' ]; then                                              
            date -d "@$1"                                                       
         fi                                                                     
} 

alias t2d='__t2d'                                                               
person leed25d    schedule 30.10.2010
comment
Для чего это всегда ложное if утверждение? - person Dennis Williamson; 31.10.2010
comment
фиксированный. Это была опечатка, извините. это действительно было предназначено для проверки существования $ 1 - person leed25d; 31.10.2010
comment
[ -n "$1" ] (использование x таким образом является архаичным и ненужным для любой современной оболочки) - person Dennis Williamson; 31.10.2010
comment
Ну, можешь звать меня Олд Скул. Исходный вопрос касался псевдонимов и аргументов к ним. Я полагаю, что ваше замечание не вносит ничего существенного в разговор. - person leed25d; 31.10.2010
comment
ну, это довольно хорошая информация, хотя не использовать x, потому что это сбивает с толку новичков, что, похоже, по какой-то причине нравится высокомерным кодерам. Мы должны помогать здесь, и то, является ли что-то старой школой, на самом деле не оправдывает путаницу, которую это вносит на стол. - person osirisgothra; 02.11.2013
comment
Хорошей информацией было бы сказать новичкам вообще не делать этого, так как это совершенно бессмысленно. То, что они хотят, это просто функция. Создание функции, а затем псевдоним для другого имени действительно совершенно бессмысленно. - person remmy; 24.07.2014
comment
@ leed25d Глупый вопрос: если вы пишете __t2d как функцию, то зачем вам вообще нужен псевдоним? Почему бы не назвать функцию t2d и не использовать псевдоним? - person Mark E. Haase; 12.03.2015
comment
@MarkE.Haase Я не думаю, что на это когда-нибудь будет хороший ответ. Все, что вам нужно сделать, это взглянуть на стиль кодирования, чтобы понять, что этот человек пишет код, который принадлежит 1978 году. 8 пробелов для табуляции? Двойные подчеркивания для «скрытых» функций? Намерение, вероятно, состояло в том, чтобы скрыть реализацию за псевдонимом, который может свободно изменять вызов базовой функции, но это просто глупо. - person Anthony; 23.12.2018

чтобы использовать параметры в псевдонимах, я использую этот метод:

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'

so..

вы могли бы, если вам нужно иметь эту переменную там

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb'

конечно...

alias mongodb='./path/to/mongodb/'

на самом деле сделает то же самое без необходимости в параметрах, но, как я уже сказал, если вы хотите или нуждаетесь в них по какой-то причине (например, вам нужно 2 доллара вместо 1 доллара), вам нужно будет использовать подобную оболочку. Если он больше одной строки, вы можете подумать о том, чтобы просто написать функцию напрямую, поскольку по мере роста она станет более бельмом на глазу. Функции великолепны, поскольку вы получаете все преимущества, которые дают функции (см. завершение, ловушки, связывание и т. д., чтобы узнать о преимуществах, которые могут предоставить функции, на странице руководства bash).

Я надеюсь, что это поможет вам :)

person osirisgothra    schedule 02.11.2013
comment
~$ alias myalias='function __myalias() { echo Hello $*; сбросить -f __myalias; } __myalias' ~$ myalias -bash: синтаксическая ошибка рядом с неожиданным токеном `__myalias' - person JeeBee; 14.11.2013
comment
Это ужасно! вы переопределяете функцию каждый раз? (Я даже не могу проверить, есть ли у вас там синтаксические ошибки). - person gniourf_gniourf; 29.04.2014
comment
Это не значит, что они должны делать это ТОЧНО так, это должно было быть примером, и да, оно каждый раз переопределяется, что удерживает его в одной строке, иначе это не было бы ваншотом, не так ли? Это все равно, что жаловаться на то, что псевдоним каждый раз расширяется до назначенного ему содержимого, чем это отличается? И не надо так эмоционально. - person osirisgothra; 02.05.2014
comment
JeeBee: редактор строк соединил мои строки вместе, так что я поставил это ; там, чтобы исправить это - person osirisgothra; 07.05.2014

Это решение, которое позволяет избежать использования функции:

alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<'

результат испытаний

addone 200
input: 200
result:201
person blreay    schedule 11.04.2017
comment
Это сработало отлично для меня. Я хотел передать номер цвета (от 31 до 37) команде PS в моем псевдониме. Я сделал что-то вроде этого: alias psany='{ PS1=\e[0;$(cat -)m› \e[m;}‹‹‹' ИСПОЛЬЗОВАНИЕ: psany 32 - person zviad; 24.11.2017
comment
Это должно быть намного выше! В моем случае использование функции было нецелесообразным, потому что я хотел, чтобы return потерпел неудачу, если скрипт не был получен. Обертывание псевдонима в функцию означало, что return всегда выполняется успешно. Спасибо за решение. Я дам вам чаевые в BCH, если вы предоставите кошелек. - person Lubo Kanev; 11.04.2018

В csh (в отличие от bash) вы можете делать именно то, что хотите.

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 .)

person jimgug    schedule 16.06.2014

Чтобы упростить ответ leed25d, используйте комбинацию псевдонима и функции. Например:

function __GetIt {
    cp ./path/to/stuff/$* .
}

alias GetIt='__GetIt'
person Schroeder    schedule 24.05.2013