Я использую Bash в качестве интерактивной оболочки, и мне было интересно, есть ли простой способ заставить Bash выполнить системную команду вместо встроенной команды оболочки, если они оба имеют одно и то же имя.
Например, используйте system kill
(from util-linux
) для печати идентификатора процесса (pid) указанного процесса (ов) вместо отправки сигнала:
$ /bin/kill -p httpd
2617
...
Без указания полного пути к системной команде вместо системной команды используется встроенная команда Bash. kill
Встроенный не имеет -p
опции , чтобы команда не:
$ kill -p httpd
bash: kill: p: invalid signal specification
Я попробовал ответы, перечисленные в Make bash, используя внешнюю команду `time` вместо встроенной оболочки, но большинство из них работают только потому, что time
на самом деле это ключевое слово shell, а не встроенная оболочка .
Помимо временного отключения встроенной функции Bash enable -n kill
, лучшим решением, которое я видел до сих пор, является использование:
$(which kill) -p httpd
Существуют ли другие более простые (требующие меньшего количества ввода) способы выполнения внешней команды вместо встроенной оболочки?
Обратите внимание, что kill
это всего лишь пример, и я хотел бы получить обобщенное решение, подобное тому, как префикс с помощью command
встроенной функции предотвращает запуск функций, имеющих то же имя, что и у внешней команды. В большинстве случаев я обычно предпочитаю использовать встроенную версию, так как она сохраняет ветвление нового процесса, и иногда встроенная функция имеет функции, которых нет у внешней команды.
источник
which kill
в кавычки (не могу поместить их в комментарии) немного короче.$(…)
- увидеть это , это и это .Ответы:
Предположим
env
, на вашем пути:env
запускает исполняемый файл с именем по первому аргументу в (возможно) измененной среде; как таковой, он не знает или не работает со встроенными командами оболочки.Это приводит к некоторому сбою управления заданиями оболочки, но не зависит от внешней команды:
exec
требует замены исполняемого файла для текущей оболочки, поэтому не использует никаких встроенных модулей. Задание выполняется в фоновом режиме, поэтому вы заменяете разветвленную фоновую оболочку, а не текущую.источник
env
это явно правильный ответ ИМХО.command -p cmd
вызывая внешнюю командуzsh
, нетbash
.(exec kill -p http)
заставляет задание заменять вложенную оболочку вместо вашей текущей оболочки, и вам не нужно иметь дело с обработкой управления заданиями.env
также не знает о встроенных функциях оболочки, так как это не оболочка. Вы бы получить тот же эффект сnice
илиxargs
или любой другой программой , как это.Самый простой способ сделать то, что вы хотите, это поставить строку
в ваш
~/.bashrc
файл. После этого каждый новый логин / вызов bash будет интерпретироваться как kill/bin/kill
.источник
command
решению), а не на создание отдельного псевдонима для каждой «скрытой» команды. Теперь я отредактировал свой вопрос, чтобы сделать его более понятным и понятным. В большинстве случаев я обычно предпочитаю использовать встроенную версию, поскольку процессы могут быть определены идентификаторами заданий. Спасибо, в любом случае.Если вы знаете решение, которое требует некоторой типизации, и вы хотите решение, которое требует меньше набора, создайте его:
Аббревиатура, которая обычно требует определенных усилий, - это то, в чем превосходят компьютеры.
источник
В этом очень конкретном случае команда
pgrep
является точным соответствием необходимости.В общем смысле функция работает. Из «файловой команды»:
называть как
Но если вам нужно меньше печатать, нет более короткого пути, чем хороший псевдоним.
Из понятия «список пидов» (lp):
затем просто введите:
источник
(В zsh) Вы можете добавить к имени любой команды знак =, чтобы получить системную версию вместо встроенной. Это также удобный способ уклониться от любых псевдонимов, которые портят определенный сценарий.
источник
zsh
единственное. Я пользуюсь им регулярно, ноbash
завтра проверю с компьютера.zsh
. Хотя я пометил этот вопросbash
и использовал его в заголовке, вы должны сохранить этот ответ, так как пользователь zsh все равно сочтет его полезным.Вы можете отправить отчет об ошибке на вашу страницу
kill
руководства и спросить, почему это включает в себя нестандартные опции, которые взяты изpkill
и используются вpkill
любое время, когда вы хотите получить функции отpkill.
Если вы позвоните:
pkill httpd
Вы избегаете проблем, которые вы описываете.
источник