Как использовать аргументы командной строки в скриптах shell

Я пытаюсь написать псевдоним для grep:

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

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

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

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

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

2 ответа

Вам нужно написать реальную функцию:

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

Что там произошло? Так как я не определила $argv в моей оболочке он заменяется пустой строкой, а затем 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

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

  1. $args переменная, вероятно, уже раскрыта в вашем псевдониме.

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

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

Другие вопросы по тегам