Когда я запускаю reload терминала bash, используя исходную команду, почему я не могу объединить команды, используя &&? - PullRequest
0 голосов
/ 07 декабря 2018

Я только что изменил ~/.bash_profile, добавив в него следующий псевдоним:

alias ngrep='grep -v grep'

Затем я пошел в уже открытый терминал и запустил следующее:

source ~/.bash_profile && ps aux | grep mysql | ngrep

Выходные данныебыло:

-bash: ngrep: command not found

Тем не менее, я сразу же запустил ngrep, и он работал без ошибок.

Я хочу лучше понять Терминал.Почему я не могу связать псевдоним, который я только что добавил после выбора профиля bash, с помощью &&?

На Mac под управлением Mojave, со стандартным терминалом и bash.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

В качестве косвенного решения рассмотрите возможность редактирования шаблона соответствия.Например:

$: ps -fu $LOGNAME
     UID     PID    PPID  TTY        STIME COMMAND
P2759474    6704   10104 pty0     14:26:54 /usr/bin/ps
P2759474   10104    9968 pty0     07:59:11 /usr/bin/bash
P2759474    9968       1 ?        07:59:10 /usr/bin/mintty
$: ps -fu $LOGNAME | grep '/mintty$'
P2759474    9968       1 ?        07:59:10 /usr/bin/mintty

Вам не нужно grep -v grep, если ваш grep уже достаточно конкретен, чтобы исключить себя.

0 голосов
/ 07 декабря 2018

Псевдонимы - это простые замены префиксов, которые выполняются за до синтаксического анализа .Это дает им полномочия, которых нет у других конструкций (хотя это полномочия, которые редко нужны или уместны) - вы можете присвоить псевдоним содержимому, которое впоследствии анализируется как синтаксис, - но это также ограничивает их: поскольку составная команда должна быть проанализирована передэто может быть выполнено, команда ngrep анализируется до команды source, поэтому псевдоним еще не загружен в тот момент, когда он должен вступить в силу.


В качестве простой демонстрации (благодаря комментарию @ chepner ):

alias foo=echo; foo hi
foo bye

... будет выдавать:

-bash: foo: command not found
bye

... потому что псевдоним не был на месте, когда была проанализирована первая строка (alias foo=echo; foo hi), но - это для строки foo bye.(Псевдоним равен , когда foo hi равен run , но команда уже разбита на команду foo с аргументом hi; остающаяся возможность отсутствуетизменить foo на echo, поэтому тот факт, что псевдоним определен в это время, не влияет на выполнение).


У вас не будет этой проблемы с функцией:

# note that you can't run this in a shell that previously had ngrep defined as an alias
# ...unless you unalias it first!
ngrep() { grep -v grep "$@"; }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...