Я использовал CShell (CSH), который позволяет вам создать псевдоним, который принимает параметр. Запись была что-то вроде
alias junk="mv \\!* ~/.Trash"
В Bash это не похоже на работу. Учитывая, что Bash обладает множеством полезных функций, я предполагаю, что эта функция была реализована, но мне интересно, как это сделать.
"$1"
ls
дляls -la
, затем набравls foo bar
будет действительно выполнитьls -la foo bar
в командной строке.»alias test_args="echo PREFIX --$1-- SUFFIX"
, которая при вызове сtest_args ABCD
приводит к следующему выводу консолиPREFIX ---- SUFFIX ABCD
Ответы:
Псевдоним Bash напрямую не принимает параметры. Вам нужно будет создать функцию.
alias
не принимает параметры, но функция может быть вызвана как псевдоним. Например:Кстати, функции Bash, определенные в вашем
.bashrc
и других файлах, доступны как команды в вашей оболочке. Так, например, вы можете вызвать более раннюю функцию, как этоисточник
$1
в кавычки?source
вашего .bashrc добавит функцию, но не сглаживает старый псевдоним. Поскольку псевдонимы имеют более высокий прецедент, чем функции, он будет пытаться использовать псевдоним. Вам нужно либо закрыть и снова открыть свою оболочку, либо позвонитьunalias <name>
. Возможно, я спасу кого-то 5 минут, которые я потратил впустую.exec bash
: она запустит новую оболочку, которая даст вам полное представление о ваших конфигах, как если бы вы закрывали и открывали заново, но сохраняя настройки переменных среды этого сеанса тоже , Кроме того, выполнениеbash
без exec может быть полезно, когда вы хотите обрабатывать мысли как стек.mv "$1" "$1.bak"
. без кавычек, если бы $ 1 был "привет миром", вы бы выполнялиmv hello world hello world.bak
вместоmv "hello world" "hello world.bak"
.Уточняя ответ выше, вы можете получить 1-строчный синтаксис, как и для псевдонимов, что более удобно для специальных определений в оболочке или файлах .bashrc:
Не забывайте точку с запятой перед закрывающей правой скобкой. Аналогично, для актуального вопроса:
Или:
источник
mv "$1" "$1.bak"; cp "$2" "$1"
вmv "$1" "$1.bak" && cp "$2" "$1"
не потерять свои данные , когдаmv
сталкивается с трудностями (например, файловая система полностью).Вопрос просто задан неправильно. Вы не создаете псевдоним, который принимает параметры, потому что
alias
просто добавляет второе имя для чего-то, что уже существует. Функциональность, которую хочет OP, - этоfunction
команда для создания новой функции. Вам не нужно псевдоним функции, так как функция уже имеет имя.Я думаю, что вы хотите что-то вроде этого:
Это оно! Вы можете использовать параметры $ 1, $ 2, $ 3 и т. Д. Или просто заполнить их все $ @
источник
echo -e '#!/bin/bash\nshopt -s expand_aliases\nalias asrc='\''echo "${BASH_SOURCE[0]}"'\'' # note the '\''s\nfunction fsrc(){ echo "${BASH_SOURCE[0]}";}'>>file2&&echo -e '#!/bin/bash\n. file2\nalias rl='\''readlink -f'\''\nrl $(asrc)\nrl $(fsrc)'>>file1&&chmod +x file1&&./file1;rm -f file1 file2
$@
чтобы поддерживать имена файлов с пробелами и т. Д.TL; DR: сделать это вместо
Гораздо проще и удобочитаемее использовать функцию, чем псевдоним, чтобы поместить аргументы в середину команды.
Если вы продолжите читать, вы узнаете то, что вам не нужно знать об обработке аргументов оболочки. Знание опасно. Просто получите желаемый результат, прежде чем темная сторона навсегда контролирует вашу судьбу.
осветление
bash
псевдонимы делать принимать аргументы, но только в конце :Ввод аргументов в середину команды via
alias
действительно возможен, но это выглядит ужасно.Не пытайтесь делать это дома, детки!
Если вам нравится обходить ограничения и делать то, что говорят другие, невозможно, вот рецепт. Только не вини меня, если твои волосы запутались, а твое лицо покрылось сажей в стиле безумного ученого.
Обходной путь должен передать аргументы, которые
alias
принимают только в конце, оболочке, которая вставит их в середину и затем выполнит вашу команду.Решение 1
Если вы действительно против использования функции как таковой, вы можете использовать:
Вы можете заменить
$@
на,$1
если вы хотите только первый аргумент.Объяснение 1
Это создает временную функцию
f
, которой передаются аргументы (обратите внимание, что онаf
вызывается в самом конце).unset -f
Удаляет определение функции в качестве псевдонима выполняется так что не торчать после этого.Решение 2
Вы также можете использовать подоболочку:
Объяснение 2
Псевдоним создает команду вроде:
Комментарии:
Заполнитель
_
обязателен, но это может быть что угодно. Он получает значениеsh
s$0
и необходим для того, чтобы первый из заданных пользователем аргументов не использовался. Демонстрация:Одиночные кавычки внутри одинарных кавычек обязательны. Вот пример того, как он не работает с двойными кавычками:
Здесь значения интерактивной оболочки
$0
и$@
заменяются в двойные кавычки, прежде чем он передаетсяsh
. Вот доказательство:Одинарные кавычки гарантируют, что эти переменные не интерпретируются интерактивной оболочкой и передаются буквально
sh -c
.Вы можете использовать двойные кавычки и
\$@
, но лучше всего указывать свои аргументы (так как они могут содержать пробелы), и\"\$@\"
выглядит еще страшнее, но может помочь вам выиграть конкурс на запутывание, где запутанные волосы являются обязательным условием для участия.источник
alias gc='git checkout'
$@
? Они необходимы, если у вас есть, например, файлы с пробелами в них.Альтернативное решение состоит в том, чтобы использовать маркер , инструмент, который я недавно создал, который позволяет вам «закладывать» шаблоны команд и легко размещать курсор на заполнителях команд:
Я обнаружил, что большую часть времени я использую функции оболочки, поэтому мне не нужно снова и снова писать часто используемые команды в командной строке. Проблема использования функций для этого варианта использования заключается в добавлении новых терминов в мой командный словарь и необходимости запоминать, на какие параметры функций ссылаются в реальной команде. Цель маркера - устранить это умственное бремя.
источник
Все, что вам нужно сделать, это сделать функцию внутри псевдонима:
Вы должны поместить двойные кавычки вокруг "$ 1", потому что одинарные кавычки не будут работать.
источник
bash: syntax error near unexpected token '{mkdir'
.;
внутри функции,_mkcd
скорее всего, ошибка в этом.{
и}
Вот три примера функций, которые у меня есть
~/.bashrc
, которые по сути являются псевдонимами, которые принимают параметр:,
,
,
Ссылки:
источник
Bash псевдоним абсолютно принимает параметры. Я просто добавил псевдоним, чтобы создать новое приложение реагирования, которое принимает имя приложения в качестве параметра. Вот мой процесс:
Откройте bash_profile для редактирования в нано
Добавьте ваши псевдонимы, по одному в строке:
Сохраните и выйдите из нано-редактора
Скажите терминалу использовать новые псевдонимы в .bash_profile
Это оно! Теперь вы можете использовать ваши новые псевдонимы
источник
NB: В случае, если идея не очевидна, плохая идея - использовать псевдонимы для чего угодно, кроме псевдонимов, первый из которых - «функция в псевдониме», а второй - «трудно читаемый редирект / источник». Кроме того, есть недостатки (которые, я думал , будут очевидны, но на случай, если вы запутаетесь: я не имею в виду, что они действительно будут использоваться ... где угодно!)
.................................................. .................................................. ............................................
Я отвечал на это раньше, и так было всегда в прошлом:
что хорошо и хорошо, если только вы не избегаете использования функций вместе. в этом случае вы можете воспользоваться огромной способностью bash перенаправлять текст:
Они оба примерно одинаковой длины дают или принимают несколько символов.
Реальная брыкунья разница во время, вершина является «методом функции» , а нижняя является методом «перенаправления-источник». Чтобы доказать эту теорию, время говорит само за себя:
Это нижняя часть около 200 результатов, сделанных через случайные интервалы. Кажется, что создание / уничтожение функции занимает больше времени, чем перенаправление. Надеюсь, это поможет будущим посетителям в этом вопросе (не хотел оставлять его при себе).
источник
time for i in {1..1000}; do foo FOOVALUE; done
→ 0m0,028s. Ноtime for i in {1..1000}; do bar FOOVALUE; done
→ 0m2.739s. Бар на два порядка медленнее, чем foo. Простое использование простой функции вместо псевдонима сокращает время выполнения еще на 30%:function boo() { echo "arg1 for boo=$1" ; }
⇒time for i in {1..1000}; do boo FOOVALUE; done
→ 0m0.019s.Если вы ищете общий способ применения всех параметров к функции, а не просто один, два или несколько других жестко заданных значений, вы можете сделать это следующим образом:
Таким образом, в приведенном выше примере я передаю все параметры с момента запуска
runjar
псевдонима.Например, если бы я
runjar hi there
это сделал, это бы в конечном итоге запуститьjava -jar myjar.jar hi there
. Если бы яrunjar one two three
это сделал, он бы побежалjava -jar myjar.jar one two three
.Мне нравится это
$@
решение на основе, потому что оно работает с любым количеством параметров.источник
runjar
вместо того, чтобы сделать ее псевдонимом для функции? Кажется излишне сложным!alias
(или передаются свойства вещейalias
) в файлы bash? если да, то это просто я не знал, чтоalias runjar='java -jar myjar.jar'
. Псевдонимы принимают аргументы, но только в конце.С уважением ко всем, кто говорит, что вы не можете вставить параметр в середину псевдонима, я только что проверил его и обнаружил, что он работает.
alias mycommand = "python3" $ 1 "script.py --folderoutput RESULTS /"
когда я тогда запустил mycommand foobar, он работал точно так же, как если бы я набрал команду от руки.
источник
alias myalias="echo 1 "$1" 3"; myalias 2
дает мне:1 3 2
Есть законные технические причины, чтобы хотеть обобщенного решения проблемы псевдонима bash, не имеющего механизма для принятия произвольных аргументов. Одна из причин заключается в том, что на команду, которую вы хотите выполнить, негативно повлияют изменения в среде, возникшие в результате выполнения функции. Во всех остальных случаях следует использовать функции.
Что недавно заставило меня попытаться решить эту проблему, так это то, что я хотел создать несколько сокращенных команд для печати определений переменных и функций. Поэтому я написал несколько функций для этой цели. Однако существуют определенные переменные, которые (или могут быть) изменены самим вызовом функции. Среди них:
FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV
Основная команда, которую я использовал (в функции) для печати переменных defns. в форме вывода командой set было:
Например:
Проблема: Это не выведет определения переменных, упомянутых выше, как они есть в текущем контексте , например, если в приглашении интерактивной оболочки (или не в каких-либо вызовах функций), FUNCNAME не определено. Но моя функция говорит мне неверную информацию:
Одно решение, которое я придумал, было упомянуто другими в других сообщениях на эту тему. Для этой конкретной команды для печати переменных defns., Которая требует только один аргумент, я сделал это:
Что дает правильный вывод (нет) и статус результата (ложь):
Тем не менее, я все еще чувствовал необходимость найти решение, которое работает для произвольного числа аргументов.
Общее решение для передачи произвольных аргументов команде с псевдонимом Bash:
Например:
Хорошая вещь в этом решении состоит в том, что все специальные приемы, используемые для обработки позиционных параметров (аргументов) для команд, будут работать при составлении захваченной команды. Разница лишь в том, что должен использоваться синтаксис массива.
Например,
Если вы хотите "$ @", используйте "$ {CMD_ARGV [@]}".
Если вы хотите "$ #", используйте "$ {# CMD_ARGV [@]}".
И т.п.
источник
Однажды я сделал забавный проект и все еще использую его. Он показывает некоторую анимацию, пока я копирую файлы с помощью
cp
команды, потому чтоcp
ничего не отображается, и это немного расстраивает. Итак, я сделал этот псевдонимИ это сценарий вращения
Это выглядит так
Цикличная анимация)
источник
Для получения параметров вы должны использовать функции!
Однако $ @ интерпретируется при создании псевдонима, а не во время выполнения псевдонима, и экранирование $ также не работает. Как мне решить эту проблему?
Вам нужно использовать функцию оболочки вместо псевдонима, чтобы избавиться от этой проблемы. Вы можете определить foo следующим образом:
ИЛИ
Наконец, вызовите вашу функцию foo (), используя следующий синтаксис:
Убедитесь, что вы добавили свой foo () в
~/.bash_profile
или~/.zshrc
файл.В вашем случае это будет работать
источник
На самом деле, функции почти всегда являются ответом, который уже достаточно подробно описан в цитате из справочной страницы: «Практически для любых целей псевдонимы заменяются функциями оболочки».
Для полноты и потому, что это может быть полезно (немного более легкий синтаксис), можно отметить, что когда параметр (и) следует псевдониму, они все равно могут использоваться (хотя это не будет соответствовать требованию OP). Это, вероятно, проще всего продемонстрировать на примере:
позволяет мне набрать что-то вроде
ssh_disc myhost
, которое расширяется, как ожидалось, как:ssh -O stop myhost
Это может быть полезно для команд, которые принимают сложные аргументы (моя память больше не используется)
источник
И функции, и псевдонимы могут использовать параметры, как показано здесь другими. Кроме того, я хотел бы указать на несколько других аспектов:
1. функция работает в своей собственной области, псевдоним разделяет область
Может быть полезно знать эту разницу в случаях, когда вам нужно что-то скрыть или разоблачить. Это также предполагает, что функция - лучший выбор для инкапсуляции.
Вывод:
2. скрипт-обёртка - лучший выбор
Несколько раз со мной случалось, что псевдоним или функция не могут быть найдены при входе в систему через
ssh
или при переключении имен пользователей или в многопользовательской среде. Есть подсказки и приемы с файлами исходных точек, или этот интересный с псевдонимом:alias sd='sudo '
позволяет этому последующему псевдонимуalias install='sd apt-get install'
работать должным образом (обратите внимание на дополнительный пробел в ), тогда функция больше не видна. Таким образом, когда вы сомневаетесь, скрипт-обертка всегда является наиболее надежным и переносимым решением.sd='sudo '
). Однако в таких случаях скрипт-обертка работает лучше, чем функция или псевдоним. Основное преимущество скрипта-обертки заключается в том, что он видимый / исполняемый для заданного пути (т. Е. / Usr / loca / bin /), где в качестве функции / псевдонима необходимо найти источник перед использованием. Например, вы помещаете функцию в ~ / .bash_profile или ~ / .bashrc дляbash
, но позже переключаетесь на другую оболочку (т.е.zsh
источник
source
в функции работает просто отлично.f () { source /tmp/nst; }
делает именно то, что я ожидаю. Может быть, выPATH
не правы, поэтому он работает неправильноactivate
или что-то; но запускsource
из функции работает нормально.function
ключевого слова в вашем определении см. Wiki.bash-hackers.org/scripting/obsolete -function funcname {
древний синтаксис ksh bash поддерживает обратную совместимость с оболочками pre-POSIX, тогдаfuncname() {
как официальный синтаксис POSIX-стандартизирован.function funcname() {
это неверное сочетание двух, которое несовместимо с древним ksh или несовместимо с POSIX sh, и поэтому его лучше избегать.Вот пример:
Очень важно:
{
и до}
.;
после каждой команды в последовательности. Если вы забудете об этом после последней команды,>
вместо этого вы увидите приглашение!"$1"
источник
Как уже указывалось другими, использование функции должно рассматриваться как лучшая практика.
Тем не менее, вот еще один подход, используя
xargs
:Обратите внимание, что это имеет побочные эффекты в отношении перенаправления потоков.
источник
Вам не нужно ничего делать, псевдоним делает это автоматически.
Например, если я хочу, чтобы параметр git pull origin master был параметризован, я могу просто создать псевдоним следующим образом:
и при фактическом вызове вы можете передать 'master' (имя ветви) в качестве параметра, например так:
источник