вертикальная черта (" |
") соединяет поток STDOUT
из левого процесса с потоком STDIN
правого процесса. Похоже, ваша программа выводит на STDERR
.
Вы можете отправить STDERR
на STDOUT
, и оба в конвейер через:
program 2>&1 | more
Вы можете использовать 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
Вы можете использовать встроенную функцию 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 "@"
}
Используйте 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
, dash
ksh93
, 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
).