Почему мне нужно использовать эту команду дважды, чтобы выполнить ее?

С GNUsed:

sed -E 's/^.*;(.*)/\1/' file

С GNUgrep:

grep -Po '(?!.*;).*' file 
2
14.05.2021, 15:25
2 ответа

Во-первых, псевдонимы не являются функциями и не принимают аргументов. Скорее, псевдонимы представляют собой простые замены. :Когда вы набираете goto fooв командной строке и нажимаете Enter, оболочка просто заменяет gotoзначением псевдонима перед выполнением командной строки.

Следовательно, $@не распространяется на аргументы, переданные вашему псевдониму. На самом деле, в этом случае он расширяется до аргументов, переданных оболочке или сценарию, который вы используете .Вот почему gotoработает правильно во второй раз. :Теперь вы передали каталог в качестве аргумента при поиске вашего файла .zshrc, и $@расширится до этого аргумента, когда вы снова объявите псевдоним.

Кроме того, поскольку вы используете "двойные кавычки ", $@раскрывается сразу после объявления псевдонима. Чтобы убедиться, что это так, сразу после запуска вашей оболочки введите aliasбез аргументов для просмотра ваших псевдонимов.

Если вы хотите, чтобы gotoмогла обрабатывать аргументы, вы должны объявить ее как функцию:goto() { cd $@ &&... }

Однако как правило, ⚠️ следует неsource ~/.zshrc. В зависимости от того, что находится в ваших dotfiles, это может привести к самым разным проблемам.

Вместо этого, если вы внесли изменения в файл .zshrcи хотите применить их, вам следует либо перезапустить терминал (, закрыв текущую вкладку/окно и открыв новое ), либо перезапустить оболочку (, набравexec $SHELL).

3
28.07.2021, 11:32

Ответ Марлона работает. Вместо создания псевдонима я сделал следующую функцию:

function goto {
    cd $@ && exec $SHELL
}

И это прекрасно работает. Я также заметил, что поиск ~/.zshrc занимает все больше и больше времени после каждого вызова goto.

0
28.07.2021, 11:32

Теги

Похожие вопросы