Как упоминал @DopeGhoti, ${1} (или $1) является первым аргументом скрипта или функции.
Я подозреваю, что рассматриваемый вами код является частью функции, которая выглядит примерно так:
#/bin/bash
function show {
find ${1} -type f -print
}
show #...find with current directory as starting point...
show mydir #...find using `mydir` as starting point...
То есть, если при вызове функции аргумент отсутствует, ${1}
пуст и выполняется find -type f...
.
опция set -x переводит ваш скрипт в режим отладки. При этом фактическая команда передается в stderr. Поэтому вам нужно перенаправить и stdout и stderr в какой-нибудь файл. попробуйте это
your_script.sh &> outputfile.txt
Я думаю, что самым простым решением было бы добавить функцию в ваш .bashrc
файл, например:
my_run ( ) {
echo $ @
eval $ @
}
Не забудьте исходный .bashrc
после добавления функции. Затем, используя ваш пример, введите в командной строке:
my_run ls -ahl> list_dir
.
Если вы также хотите видеть вывод на экране, используйте вместо этого:
my_run ls -ahl | tee list_dir
Если вы не хотите использовать функцию, вот несколько способов сделать это из командной строки:
echo "ls -ahl"> list_dir; eval $ @ >> list_dir
Если вы также хотите видеть вывод на экране, любой из них будет работать.
echo "ls -ahl"> list_dir; eval $ @ | tee -a list_dir
echo "ls -ahl" | тройник list_dir | bash >> каталог_списка
Вывод xtrace
идет в stderr до оценки команды, включая перенаправления.
Так в:
set -x # or set -o xtrace
echo test 2> file
Команда + echo test
идет туда, куда шел stderr, затем оболочка открывает файл
на fd 2 и затем запускает echo test
. Если вы хотите, чтобы + echo test
отправился в file
, вам нужно:
{ echo test; } 2> file
В этот раз перенаправление выполняется для группы команд, а затем оценивается команда echo test
(и + echo test
записывается в stderr, который в этот момент отправляется в file
).
Обратите внимание, что некоторые оболочки, такие как AT&T ksh
, также будут выводить + 2> file
. Это также ошибочно в некоторых версиях mksh
.
Это также означает, что stderr любой команды, запущенной внутри этой группы команд, будет идти в файл
. Чтобы обойти это, вам нужно:
set -x
{
cmd 2>&3 3>&-
} 3>&2 2> file
То есть сохранить копию оригинального stderr (на fd 3) и восстановить его для команд внутри группы команд.
В bash
альтернативой является использование специальной переменной $BASH_XTRACEFD
:
exec 7> file
BASH_XTRACEFD=7
set -x
echo test
Если вам нужен красивый xtrace
вывод, попробуйте zsh
. Также обратите внимание, что его можно настроить с помощью специальной переменной $PS4
.