Ответ 1
Попробуйте определить функцию в ~/.profile.
function greplogs(){
grep "$1" */logs/*.log
}
Я пытаюсь определить псевдоним, где аргументы вставлены посередине, а не прилагаться к концу.
Я попытался определить его так:
alias grep_logs="grep $1 */log/*.log"
где $1 - первый аргумент grep_logs, такой, что:
grep_logs foo
выполнит следующую команду:
grep foo */log/*.log
но вместо этого он выполняет команду:
grep foo */log/*.log foo
что приводит к ошибке:
grep: foo: No such file or directory
Можно ли это сделать с помощью псевдонима или мне нужно определить функцию?
Попробуйте определить функцию в ~/.profile.
function greplogs(){
grep "$1" */logs/*.log
}
Просто для ответа на вопрос, хотя решение функции намного чище:
alias sstatus='bash -xc '\''sudo service $0 status'\'''
alias sstart='bash -xc '\''sudo service $0 start'\'''
alias sstop='bash -xc '\''sudo service $0 stop'\'''
$sstatus cups
+ sudo service cups status
Status of Common Unix Printing System: cupsd is running.
Не совсем тот ответ, который вы ищете, но используйте аргумент -e
, если вы не хотите указывать шаблон как первый аргумент
alias grep_logs="grep */log/*.log -e"
Попробуйте использовать функцию, а затем наложите ее:
function func_grep_logs {
grep $1 */log/*.log
}
затем
alias grep_logs="func_grep_logs"
Проблема заключается в том, что псевдонимы не поддерживают концепцию позиционных параметров. Если бы они это сделали, нам не нужны функции. Поэтому да, используйте функцию, потому что функции выполняются именно для этой цели.
Развернувшись на @erjoalgo answer, который до сих пор является единственным, который на самом деле отвечает на вопрос:
alias
argumentsАлиасы оболочки принимают аргументы, но только в конце:
$ alias speak=echo
$ speak hello world
hello world
Ввод аргументов в середину команды через alias
действительно возможен, но он становится уродливым.
Если вам нравится обходить ограничения и делать то, что говорят другие, невозможно, вот рецепт. Только не обвиняйте меня, если ваши волосы будут измотаны, а ваше лицо покрывается саловым сумасшедшим ученого.
Обходной путь - передать аргументы, которые alias
принимает только в конце обертки, которые будут вставлять их в середину, а затем выполнять вашу команду.
Если вы действительно против использования самой функции, вы можете использовать:
$ alias wrap_args='f(){ echo before "[email protected]" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Вы можете заменить [email protected]
на $1
, если вам нужен только первый аргумент.
Объяснение 1
Это создает временную функцию f
, которая передает аргументы (обратите внимание, что f
вызывается в самом конце). unset -f
удаляет определение функции по мере того, как выполняется псевдоним, после чего он не висит рядом.
Вы также можете использовать подоболочку:
$ alias wrap_args='sh -c '\''echo before "[email protected]" after'\'' _'
Объяснение 2
Псевдоним строит команду:
sh -c 'echo before "[email protected]" after' _
Комментарии:
Требуется заполнитель _
, но это может быть что угодно. Он устанавливается в sh
$0
и требуется, чтобы первый из заданных пользователем аргументов не потреблялся. Демонстрация:
sh -c 'echo Consumed: "$0" Printing: "[email protected]"' alcohol drunken babble
Consumed: alcohol Printing: drunken babble
Требуются одиночные кавычки внутри одиночных кавычек. Здесь пример этого не работает с двойными кавычками:
$ sh -c "echo Consumed: $0 Printing: [email protected]" alcohol drunken babble
Consumed: -bash Printing:
Здесь значения интерактивной оболочки $0
и [email protected]
заменяются на двойные кавычки, прежде чем они будут переданы в sh
. Здесь доказательство:
echo "Consumed: $0 Printing: [email protected]"
Consumed: -bash Printing:
Одиночные кавычки гарантируют, что эти переменные не интерпретируются интерактивной оболочкой и передаются буквально на sh -c
.
Вы можете использовать двойные кавычки и \[email protected]
, но лучше всего указать ваши аргументы (поскольку они могут содержать пробелы), а \"\[email protected]\"
выглядит еще более уродливым, но может помочь вам выиграть конкурс по запутыванию, где измотанные волосы предпосылка для входа.