Как я могу узнать, какая команда на самом деле была запущена в оболочке, через псевдоним или функцию

вертикальная черта (" | ") соединяет поток STDOUT из левого процесса с потоком STDIN правого процесса. Похоже, ваша программа выводит на STDERR .

Вы можете отправить STDERR на STDOUT , и оба в конвейер через:

program 2>&1 | more
20
05.05.2017, 00:59
3 ответа

Вы можете использовать shell-expand-line, которая привязана к Control-Alt-e по умолчанию:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

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

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this
14
27.01.2020, 19:43

Вы можете использовать встроенную функцию bash type, чтобы увидеть псевдоним или определение функции, которую вы собираетесь запустить:

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
2
27.01.2020, 19:43

Используйте set -xв оболочке.

$ alias hello='echo hello world!'
$ hello
hello world!
$ set -x
$ hello
+ echo hello world!
hello world!

Использование set -xвключает параметр оболочки xtrace(set +x, отключает его )и должен работать во всех оболочках Bourne -, таких как bash, dashksh93, pdkshи zsh. Это побуждает оболочку отображать команду, которая выполняется после выполнения расширений псевдонимов, расширений переменных и т. д.

Вывод будет в стандартный поток ошибок оболочки (, как и обычное приглашение ), поэтому он не будет мешать перенаправлению стандартного вывода, и ему будет предшествовать приглашение, как определено параметром PS4переменная оболочки (часто +␣по умолчанию ).

Пример с несколькими функциями:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }
$ helloworld
hello world!
$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

С вашим конкретным примером (с исправленным синтаксисом и добавленными кавычками):

$ install () { sudo apt-get install "$@"; }
$ set -x
$ install dicelab
+ install dicelab
+ sudo apt-get install dicelab
bash: sudo: command not found

(Я не использую и не использую sudoв своей системе, поэтому ожидается эта ошибка.)

Обратите внимание, что уже существует общая утилита с именем install, так что называть вашу функцию как-то иначе(aptin? )может понадобиться, если вы в какой-то момент захотите использовать эту утилиту.


Обратите внимание, что вывод трассировки — это вывод отладки . Это представление того, что делает оболочка во время выполнения вашей команды. Вывод, который вы видите на экране, может не подходить для ввода оболочки.

Также обратите внимание, что я использовал bashвыше. Другие оболочки могут иметь другое приглашение трассировки по умолчанию (zsh, включающее строку zshи номер истории текущей команды, например ), или могут не «складывать» приглашения, как bashдля вложенных вызовов.


Я запускаю Раньше я запускал с set -xво всех моих интерактивных оболочках по умолчанию. Приятно видеть, что на самом деле было выполнено... но я заметил, что программируемое завершение табуляции и т. д. может вызвать нежелательный вывод трассировки в некоторых оболочках, а некоторые оболочки немного подробны в выводе трассировки по умолчанию (, например.zsh).

32
27.01.2020, 19:43

Теги

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