Как переопределить команду из нескольких слов псевдонимом в zsh?

Когда вы выполняете сценарий оболочки, он запускает процесс, известный как подоболочка. Как дочерний процесс основной оболочки, подоболочка выполняет список команд в сценарии оболочки какbatch(так -, что называется «пакетной обработкой» ).

В некоторых случаях может потребоваться узнать идентификатор процесса (PID )подоболочки, в которой выполняется сценарий оболочки.

В баш,PID процесса подоболочки сценария оболочки хранится в специальной переменной с именем «$$». Эта переменная доступна только для чтения -, и вы не можете изменить ее в сценарии оболочки. Например:

$ cat xyz.sh
#!/bin/bash
echo "PID of this script: $$"

Что дает следующий результат

PID of this script: XXXX

Оболочка bash экспортирует несколько других переменных -только для чтения. Например, PPID хранит идентификатор родительского процесса подоболочки (, т. е. основной оболочки ). UID хранит идентификатор текущего пользователя, выполняющего скрипт. Вот так (только пример)

#!/bin/bash
echo "PID of this script: $$"
echo "PPID of this script: $PPID"
echo "UID of this script: $

Что дает вывод

PID of this script: XXXX 
PPID of this script: XXXX 
UID of this script: XXXX
2
04.09.2020, 22:59
1 ответ

Технически, как и в csh, откуда взялась эта aliasошибка, вы могли бы:

alias docker='docker '
alias     ps='ps --format="table {{.ID}} {{.Image}} {{.Status}}"'

Это позволит достичь желаемого, но это будет означать, что:

  1. Все слова, следующие за docker, подлежат расширению псевдонимов (, что alias cmd='cmd 'трюк предназначен для таких команд, как command, env, sudo, которые принимают команды в качестве аргументов, поэтому псевдонимы также расширяются после их ).
  2. Слово psбез dockerперед ним также будет расширено, что означает, что вы больше не сможете запускать автономную команду ps, если не измените формулировку вызова (, например"ps" -ef).

Здесь я бы просто определил новую команду с другим именем, чтобы она не конфликтовала с исходной, которая делает то, что вы хотите:

my-docker-ps() docker ps --format="table {{.ID}} {{.Image}} {{.Status}}" "$@"

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

1
28.04.2021, 23:07

Теги

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