2015-07-16 2 views
2

Я пытаюсь написать псевдоним grep:Как использовать аргументы командной строки в сценарии оболочки рыб

# config.fish 
alias grepcustom="grep -r $argv ~/" 

В основном то, что я хочу, чтобы это сделать, это рекурсивный Grep на моем домашнем каталоге, без необходимости вводить все (я знаю, ленивый).

Когда я перезапустить оболочку и запустить grepcustom я получаю:

$ grepcustom "hello" 
grep: hello: No such file or directory 

Существует файл, который содержит «привет». Если я запустил grep -r в оболочке, он работает правильно. Однако проблема заключается в том, как мой псевдоним идентифицирует аргумент командной строки «привет». Что я делаю не так?

ответ

0

Я не знаю рыбы, но две вещи.

  1. Переменная, вероятно, уже расширена в вашем псевдониме.

    Запуск alias grepcustom или любая команда рыбы показывает вам значение псевдонима, и вы должны это увидеть. Для этого вам нужны одинарные кавычки в определении псевдонима.

  2. Если рыба не поддерживает ваше размещение вручную в псевдониме (вместо обычного места), это не сработает, потому что псевдонимы выставляют аргументы после расширения псевдонима. Для этого вам понадобится функция.

7

Вы собираетесь должны написать фактическую функцию:

$ alias grepcustom="grep -r $argv ~/" 
$ type grepcustom 
grepcustom is a function with definition 
function grepcustom 
    grep -r ~/ $argv; 
end 

Что там произошло? Так как я не определил в своей оболочке, он заменен пустой строкой, а затем alias добавил $ argv, чтобы заставить функцию работать. Попробуем с одинарными котировками:

$ alias grepcustom='grep -r $argv ~/' 
$ type grepcustom 
grepcustom is a function with definition 
function grepcustom 
    grep -r $argv ~/ $argv; 
end 

Это явно не так. Вы хотите

function grepcustom -a pattern 
    grep -r $pattern ~/ 
end 
+0

Это интересно. Что такое '-a'? Также в вашем втором примере, почему «$ argv» размещался как после '-r', так и в конце инструкции? – dopatraman

+2

параметр '-a' [команда' function'] (http://fishshell.com/docs/current/commands.html#function) позволяет вам называть аргументы функции. '$ argv' появляется дважды, потому что' alias foo = bar' создает это: 'function foo; bar $ argv; end' - т. е. [$ argv явно добавлено] (http://fishshell.com/docs/current/commands.html#alias), независимо от того, что такое 'bar'. –

Смежные вопросы