Эхо-команды и вывод в файл из интерактивной оболочки [закрыто]

Как упоминал @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... .

0
21.12.2016, 21:00
3 ответа

опция set -x переводит ваш скрипт в режим отладки. При этом фактическая команда передается в stderr. Поэтому вам нужно перенаправить и stdout и stderr в какой-нибудь файл. попробуйте это
your_script.sh &> outputfile.txt

2
28.01.2020, 02:26

Я думаю, что самым простым решением было бы добавить функцию в ваш .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 >> каталог_списка

0
28.01.2020, 02:26

Вывод 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.

1
28.01.2020, 02:26

Теги

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