Как передать аргументы командной строки псевдониму оболочки?

289

Как передать аргументы командной строки псевдониму? Вот образец:

псевдоним mkcd = 'mkdir $ 1; CD $ 1; '

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

function mkcd () {
  mkdir $ 1
  CD $ 1
}

Просто хотел узнать, есть ли способ сделать псевдонимы, которые принимают параметры CL.
Кстати, я использую 'bash' в качестве оболочки по умолчанию.

Vini
источник
2
O / T, но в качестве альтернативы выполнению функции mkcd, вы можете написатьmkdir mydirectoryname && cd $_
moala

Ответы:

174

Вы нашли способ: создать функцию вместо псевдонима. Оболочка C имеет механизм для аргументов псевдонимов, но bash и оболочка Korn этого не делают, потому что механизм функций более гибкий и предлагает те же возможности.

Чарли Мартин
источник
Однако вам не нужны функции при создании псевдонимов в .bashrcфайле. Например, # создайте псевдоним, который принимает номер порта от пользователя. Псевдоним serve = "python -m SimpleHTTPServer $ 1" После внесения изменений в файл .bashrc обязательно введите следующую команду. ~ $ source .bashrc Вы можете использовать это примерно так ~ $ serve 8998
kaizer1v
8
@ kaizer1v, Мое наблюдение на CentOS7.3 bash версии 4.2.46 заключается в том, что ваше предложение не работает так, как вы думаете. Поскольку вы используете двойные кавычки, $ 1 фактически оценивается как пустая строка, а псевдоним фактически совпадает с псевдонимом serve = "python -m SimpleHTTPServer", и поэтому все, что вы передаете после этого псевдонима, также передается в командной строке. Если вы попробуете это установить -x; alias serve = "python -m SimpleHTTPServer $ 1 &" вы увидите ошибку / проблему. И ваш аргумент, и команда alias запускаются как отдельные команды.
PatS
279

Просто чтобы повторить то, что было опубликовано для других оболочек, в Bash следующие работы:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

Запуск следующего:

blah one two

Дает вывод ниже:

First: one
Second: two
Томас Братт
источник
4
Отличное решение. Некоторые вопросы новичка в bash: должна ли функция называться с подчеркиванием (или вообще иначе) или это просто для удобства чтения? Какова цель конечного "; _blah" в определении функции? Почему это не работает при использовании двойных кавычек вместо одинарных кавычек ($ 1 не интерпретируется правильно), даже если выполняется что-то, что не требует кавычек вокруг $ 1? Заранее спасибо за совет. У меня есть рабочее решение, но я всегда хотел бы больше понять, почему оно работает.
mynameispaulie
4
@mynameispaulie Функция может быть названа как угодно. Я использовал префикс подчеркивания, так как это распространенный прием, помогающий предотвратить конфликты имен (то есть другую функцию с тем же именем)
Томас Братт,
6
@mynameispaulie Двойные кавычки позволяют Bashзаменить $1и $2параметрами, переданными в функцию. Одиночные кавычки говорят Bash не делать этого.
Томас Братт
5
Я вижу, что это псевдоним / функция комбинированного копирования / вставлена ​​много, но, похоже, не служит какой-либо полезной цели. Стандартный подход состоит в том, чтобы определить функцию один раз, с нормальным именем, и не иметь псевдоним.
tripleee
16
Я не вижу, как это предпочтительнее, чемfunction blah(){ echo "First: $1"; echo "Second: $2"; }
Рене Нюффенеггер
57

Вы не можете в ksh, но вы можете в csh.

alias mkcd 'mkdir \!^; cd \!^1'

В ksh функция - это путь. Но если вы действительно хотите использовать псевдоним:

alias mkcd='_(){ mkdir $1; cd $1; }; _'
Санджая Р
источник
В качестве интересного примечания, я думаю, что уязвимость удаленного выполнения кода, о которой все недавно говорили, заключается в том, чтобы делать почти то же самое, но в переменной окружения, устанавливаемой необработанным пользовательским вводом. openwall.com/lists/oss-security/2014/09/24/11
Флёгипоки
@Floegipoky - потому что он в псевдониме, а не в env var, существенно отличается. Проблема ShellShock заключается в том, что он запускается, когда задана переменная env. Установка env var должна быть безопасной операцией. Никакой сценарий не выполняется, когда установлен вышеупомянутый псевдоним, только когда запущен псевдоним.
Санджая Р
Возможно, следует отметить, что cshобычно это не то, что современный человек должен хотеть использовать. Косвенная псевдоним «который создает созданную функцию, а затем выполняет эту функцию» является относительно популярным, но, насколько я могу судить, не дает никаких преимуществ по сравнению с правильной функцией. (В любом случае, функция должна правильно указывать свой аргумент.)
tripleee
17

Чтобы процитировать страницу руководства bash:

Механизм использования аргументов в тексте замены отсутствует. Если требуются аргументы, следует использовать функцию оболочки (см. Ниже ФУНКЦИИ).

Похоже, вы ответили на свой вопрос - используйте функцию вместо псевдонима

Крис Додд
источник
12

Вы также можете найти эту команду полезной:

mkdir dirname && cd $_

где dirname - это имя каталога, который вы хотите создать

tdecs
источник
1
@StarDust $_- вывод последней команды unix.stackexchange.com/a/271693/169772
Тейлор
5

Я обнаружил, что функции не могут быть записаны в ~/.cshrcфайл. Здесь в псевдониме, который принимает аргументы

например, аргументы, переданные команде 'find'

alias fl "find . -name '\!:1'"     
Ex: >fl abc

где abc - аргумент, передаваемый как!: 1

Кумар Паланиаппан
источник
4
Это не полезно для OP, чья оболочка по умолчанию - bash. И в ответе Санджая Р упоминались псевдонимы csh 4 года назад.
Кит Томпсон
1
Ответ Санджая Р. не объяснил, что это !:1значит. Мне пришлось прокрутить вниз, чтобы увидеть, что это был аргумент. Хороший ответ не оставляет больше вопросов, даже если бы не было типа оболочки OPs.
searchengine27
4

Самый простой способ - использовать функцию, а не псевдоним. Вы все еще можете вызвать функцию в любое время из кли. В bash вы можете просто добавить функцию name () {command}, которая загружается так же, как псевдоним.

function mkcd() { mkdir $1; cd $1 ;}

Не уверен насчет других оболочек

Люк Аттард
источник
2

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

Смотрите здесь для получения дополнительной информации: http://www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-functions/ . (Да, я знаю, что это mactips.org, но речь идет о Bash, так что не волнуйтесь.)

samoz
источник
1

Это работает в ksh:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

Опция "-x" делает псевдоним "экспортированным" - псевдоним виден в подоболочках.

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


источник
-2

Вот простой пример функции с использованием Python. Вы можете вставить в ~ / .bashrc
У вас должен быть пробел после первой левой фигурной скобки.
Команда python должна быть в двойных кавычках, чтобы получить подстановку переменной.
Не забывайте эту точку с запятой в конце

function count () {python -c "для num в xrange ($ 1): print num";}

$ count 6
0
1
2
3
4
5
$
AAAfarmclub
источник
-5

Пустой псевдоним выполнит свои аргументы:

alias DEBUG=
Питер Шарп
источник
12
По вашему представителю я вижу, что вы новичок в SO (Stack Overflow). Пожалуйста, не разочаровывайтесь в голосовании за ваш ответ. Это было отклонено, потому что это действительно не отвечает на вопрос, на который OP (Оригинальный Плакат) попросил ответить. Повесьте их и продолжайте пытаться. Также, отвечая, попробуйте включить простой пример того, как работает ваш ответ, и покажите результаты. Это поможет другим увидеть, как работает ваш ответ.
PatS