Як передати аргументи командного рядка на псевдонім оболонки?


288

Як передати аргументи командного рядка на псевдонім? Ось зразок:

псевдонім mkcd = 'mkdir $ 1; cd $ 1; '

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

функція mkcd () {
  mkdir $ 1
  cd $ 1
}

Просто хотів дізнатися, чи є спосіб зробити псевдоніми, які приймають параметри CL.
BTW - я використовую "bash" як оболонку за замовчуванням.



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 &", ви побачите помилку / проблему. І ваш аргумент, і команда псевдонім виконуються як окремі команди.
PatS

279

Тільки щоб повторити те, що було розміщено для інших снарядів, в Bash такі роботи:

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

Запуск наступного:

blah one two

Дає вихід нижче:

First: one
Second: two

4
Прекрасне рішення. Деякі запитання від початківця-початківця: чи має бути функція названа підкресленням (або взагалі по-іншому) чи це просто для читання? Яка мета останнього "; _blah" у визначенні функції? Чому це не працює при використанні подвійних лапок замість одинарних лапок ($ 1 не трактується правильно), навіть коли ви робите щось, що не вимагає котирувань навколо $ 1? Заздалегідь дякую за пораду. У мене є робоче рішення, але завжди люблю більше розуміти, чому воно працює.
mynameispaulie

4
@mynameispaulie Функцію можна назвати чим завгодно. Я використав префікс підкреслення, тому що це звичайний трюк, щоб запобігти зіткненням імен (тобто інша функція з таким самим іменем)
Thomas Bratt

6
@mynameispaulie Подвійні лапки дозволяють Bashзамінити $1і $2з параметрами , що передаються в функцію. Одиночні цитати говорять Башу не робити цього.
Томас Братт

5
Я бачу цей псевдонім / функцію комбінованої копії / вклеювання дуже багато, але він, здається, не корисний. Стандартним підходом було б визначити функцію один раз із здоровим іменем, а не мати псевдонім.
трійка

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

@Floegipoky - Тому що це псевдонім, а не env var, його істотно відрізняється. Проблеми ShellShock полягають у тому, що він працює, коли встановлюється env var. Встановлення env var повинно бути безпечною експлуатацією. Жоден сценарій не виконується, коли встановлений вище псевдонім, лише коли виконується псевдонім.
Санджая Р

Можливо, слід зазначити, що cshзазвичай це не те, чим сучасна людина повинна хотіти користуватися. Псевдонім-який-створює-функцію-потім-виконує-цю функцію непрямим є відносно популярним, але не дає користі над належною функцією, наскільки я можу сказати. (У будь-якому випадку функція повинна правильно цитувати свої аргументи.)
tripleee

17

Щоб процитувати сторінку bash man:

Немає механізму використання аргументів у тексті заміни. Якщо потрібні аргументи, слід використовувати функцію оболонки (див. ФУНКЦІЇ нижче).

Так виглядає, що ви відповіли на власне запитання - використовуйте функцію замість псевдоніму



5

Я виявив, що функції не можна записати ~/.cshrc файл. Тут у псевдонімі, який бере аргументи

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

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

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


4
Це не корисно для ОП, оболонка якого за замовчуванням - bash. І відповідь Санджа Р згадувала псевдоніми csh 4 роки тому.
Кіт Томпсон

1
Відповідь Санджа Р не пояснила, що !:1означає. Мені довелося прокрутити вниз, щоб побачити, що це аргумент. Гарна відповідь не залишає більше запитань, навіть якщо це не було для типу оболонки ОП.
searchengine27

4

Найпростіший спосіб - це використовувати функцію, не псевдонім. Ви все одно можете зателефонувати у будь-який момент із кліпу. У bash ви можете просто додати ім'я функції () {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, але це стосується Баша, тому не хвилюйтесь.)


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 повинна містити подвійні лапки, щоб отримати підстановку змінної.
Не забувайте, що крапка з комою в кінці

функція count () {python -c "для num в xrange ($ 1): число друку";}

$ count 6
0
1
2
3
4
5
$

-5

Порожній псевдонім виконає свої аргументи:

alias DEBUG=

12
Вашим представником я бачу, що ви новачок у SO (Переповнення стека). Будь ласка, не лякайтеся, коли ви не відповіли голосуванням. Він був проголосований, оскільки він дійсно не відповідає на питання, на яке ОП (Оригінальний плакат) відповів. Повісьте їх і продовжуйте намагатися. Також, відповідаючи, спробуйте включити простий приклад того, як працює ваша відповідь, і покажіть результат. Це допоможе іншим побачити, як працює ваша відповідь.
PatS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.