Подтвердить что ты не робот

Как создать псевдоним, где аргументы идут посередине?

Я пытаюсь определить псевдоним, где аргументы вставлены посередине, а не прилагаться к концу.

Я попытался определить его так:

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

Можно ли это сделать с помощью псевдонима или мне нужно определить функцию?

4b9b3361

Ответ 1

Попробуйте определить функцию в ~/.profile.

function greplogs(){
    grep "$1" */logs/*.log
}

Ответ 2

Просто для ответа на вопрос, хотя решение функции намного чище:

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.

Ответ 3

Не совсем тот ответ, который вы ищете, но используйте аргумент -e, если вы не хотите указывать шаблон как первый аргумент

alias grep_logs="grep */log/*.log -e"

Ответ 4

Попробуйте использовать функцию, а затем наложите ее:

function func_grep_logs {
    grep $1 */log/*.log
}

затем

alias grep_logs="func_grep_logs"

Ответ 5

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

Ответ 6

Развернувшись на @erjoalgo answer, который до сих пор является единственным, который на самом деле отвечает на вопрос:

alias arguments

Алиасы оболочки принимают аргументы, но только в конце:

$ alias speak=echo
$ speak hello world
hello world

Ввод аргументов в середину команды через alias действительно возможен, но он становится уродливым.

Не пробуйте это дома, детишки!

Если вам нравится обходить ограничения и делать то, что говорят другие, невозможно, вот рецепт. Только не обвиняйте меня, если ваши волосы будут измотаны, а ваше лицо покрывается саловым сумасшедшим ученого.

Обходной путь - передать аргументы, которые alias принимает только в конце обертки, которые будут вставлять их в середину, а затем выполнять вашу команду.

Решение 1

Если вы действительно против использования самой функции, вы можете использовать:

$ 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 удаляет определение функции по мере того, как выполняется псевдоним, после чего он не висит рядом.

Решение 2

Вы также можете использовать подоболочку:

$ 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]\" выглядит еще более уродливым, но может помочь вам выиграть конкурс по запутыванию, где измотанные волосы предпосылка для входа.