shell - пузыря - как укрепить плодный пузырь




Как выполнять команды оболочки во время их выполнения? (10)

Введите «bash -x» в командной строке перед именем сценария bash. Например, чтобы выполнить foo.sh, введите:

bash -x foo.sh

В сценарии оболочки, как я эхо всех команд оболочки, вызываемых и расширяющих имена переменных? Например, учитывая следующую строку:

ls $DIRNAME

Я хотел бы, чтобы скрипт выполнил команду и отобразил следующее

ls /full/path/to/some/dir

Цель состоит в том, чтобы сохранить журнал всех вызванных команд оболочки и их аргументов. Может быть, есть лучший способ создать такой журнал?


Вы можете выполнить сценарий bash в режиме отладки с опцией -x .
Это будет отражать все команды.

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt


Вы также можете сохранить параметр -x в скрипте . Просто укажите параметр -x в shebang.

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt




Для csh и tcsh вы можете set verbose или set echo (или вы даже можете установить оба варианта, но это может привести к некоторому дублированию большую часть времени).

verbose вариант печатает в значительной степени точное выражение оболочки, которое вы вводите.

Опция echo больше указывает на то, что будет выполнено путем нереста.

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo

Special shell variables

verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.

echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.


Для zsh echo

 setopt VERBOSE

и для отладки

 setopt XTRACE

Кто-то выше написал:

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

и это выглядит многообещающе, но я не могу для жизни меня понять, что он делает. Я искал Google и искал на странице man bash для «\ $» и «$ @» и ничего не нашел.

Я понимаю, что создается функция с именем «exec ()». Я понимаю, что фигурные скобки обозначают начало и конец функции. Кажется, я понимаю, что полуколония обозначает «жесткий возврат» между многострочной командой, так что «{echo» \ $ $ @ "; "$ @"; } 'становится, по существу:

{
echo "\$ [email protected]"
"[email protected]"

}

Может ли кто-нибудь дать мне краткое объяснение или где найти эту информацию, так как, очевидно, мой google-fu терпит неудачу?

(Не имея смысла начинать новый вопрос по старому потоку, моя цель - перенаправить вывод в файл. Метод set -x; [commands]; set + x будет работать для меня хорошо, но я могу " t выяснить, как эхо результатов в файл вместо экрана, поэтому я пытался понять этот другой метод в надежде, что смогу использовать меня очень плохое понимание перенаправления / pipe / tee / etc, чтобы сделать то же самое.)

Спасибо!

ПОСЛЕДНИЙ РЕДАКТ:

С некоторым возиться, я считаю, что понял это. Вот мой эквивалентный код для того, что мне нужно:

SCRIPT_LOG="\home\buddy\logfile.txt"
exe () {
  params="[email protected]"                       # Put all of the command-line into "params"
  printf "%s\t$params" "$(date)" >> "$SCRIPT_LOG"   # Print the command to the log file
  $params                           # Execute the command
}

exe rm -rf /Library/LaunchAgents/offendingfile
exe rm -rf /Library/LaunchAgents/secondoffendingfile

Результаты в файле logfile.txt выглядят примерно так:

Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/offendingfile
Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/secondoffendingfile

Только то, что мне было нужно. Спасибо!


Ответ shuckc для эхо-строк выбора имеет несколько недостатков: в итоге вы также выполните команду set +x , и вы потеряете возможность проверить код выхода с помощью $? так как он перезаписывается set +x .

Другой вариант - запустить команду в подоболочке:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

который даст вам выход:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

Тем не менее, это накладывает дополнительные накладные расходы на создание новой подоболочки для команды.


Чтобы позволить эмулировать составные команды, я использую exe функцию eval plus Soth для эха, а затем запускаю команду. Это полезно для команд с каналами, которые в противном случае отображали бы только одну или только начальную часть команды.

Без eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe ls -F | grep *.txt

Выходы:

$
file.txt

С eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe eval 'ls -F | grep *.txt'

Какие результаты

$ exe eval 'ls -F | grep *.txt'
file.txt

Я использую функцию для эха, затем выполняю команду

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

exe echo hello world

Какие результаты

$ echo hello world
hello world

Редактировать:

Для более сложных команд и т. Д. Вы можете использовать eval:

#!/bin/bash
#function to display commands
exe() { echo "\$ ${@/eval/}" ; "[email protected]" ; }

exe eval "echo 'Hello World' | cut -d ' ' -f1"

Какие результаты

$  echo 'Hello World' | cut -d ' ' -f1
Hello

set -x или set -o xtrace расширяет переменные и печатает знак + + перед строкой.

set -v или set -o verbose не расширяет переменные перед печатью.

Используйте set +x и set +v чтобы отключить указанные выше настройки.

В первой строке скрипта можно поставить #!/bin/sh -x (или -v ) на тот же эффект, что и set -x (или -v ) позже в скрипте.

Вышеупомянутое также работает с /bin/sh .

http://www.faqs.org/docs/abs/HTML/options.html

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

$ bash -x shl 
+ DIR=/tmp/so
+ ls /tmp/so
$

$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

Вывод выглядит следующим образом:







shell