У меня есть скрипт, launch.sh
который выполняется как другой пользователь, чтобы создавать файлы с правильным владельцем. Я хочу передать -x на этот вызов, если он был первоначально передан в сценарий
if [ `whoami` == "deployuser" ]; then
... bunch of commands that need files to be created as deployuser
else
echo "Respawning myself as the deployment user... #Inception"
echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
sudo -u deployuser -H bash $0 "$@" # How to pass -x here if it was passed to the script initially?
fi
Я прочитал страницу отладки bash, но, похоже, нет четкой опции, которая сообщала бы, был ли запущен оригинальный скрипт -x
.
[[ $- == *x* ]]
для сопоставления с образцом.case $- in *x*) ... ;; *) ... ;; esac
. Полезно знать это использованиеcase
для сценариев, которые должны быть переносимыми, и теперь, когда я знаю об этом, мне легче просто запомнить это, чем помнить «если специфичен для bash, то[[
ещеcase
».$-
выходыhB
. Что делают-h
и-B
флаги / аргументы? Не смотрите на страницу руководства bash .set -o
выдаст,xtrace on
если-x
используется, в противном случаеxtrace off
.источник
Хотя ответ @Patrick является «правильным», вы также можете просто передать параметр или экспортированную переменную в свой дочерний скрипт, который скажет ему, что делать - например, включить трассировку.
Это имеет тот недостаток, что (я считаю) вы должны реэкспортировать его на каждый уровень сценария, который вы собираетесь ввести.
Он имеет то преимущество, что может выборочно отслеживать (или иным образом влиять) только те сценарии, для которых нужно выводить / изменять поведение - для сокращения посторонних выводов и т. Д. Например, для вызывающего сценария может быть отключена трассировка все еще включается в вызываемом скрипте. Это не предложение «все или ничего».
Не часть вашего вопроса, но связанная:
Я иногда определяю переменную как
или
и использовать его (в нескольких утверждениях), как
или, только для второго варианта,
Затем я просто закомментирую второе определение, когда хочу выполнить команду (и). Вы также можете использовать эту технику с параметром или экспортированной переменной.
С любым из них вы должны следить за составными операторами, потому что метод гарантированно будет работать только с первым оператором в составном списке.
источник
Вы можете получить PID процесса, а затем просмотреть таблицу процессов с помощью ps, чтобы увидеть, каковы ее аргументы.
источник
-x
была установлена внутри скрипта, она не будет отображаться вps
выходных данных. И это решение в любом случае неэффективно.set -o
решение, которое я предложил. Он также должен работать для опций, которые не имеют связанных флагов, таких как-x
.