Mam skrypt, launch.sh
który wykonuje się jako inny użytkownik, aby tworzyć pliki z poprawnym właścicielem. Chcę przekazać -x do tego wywołania, jeśli zostało ono pierwotnie przekazane do skryptu
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
Przeczytałem stronę debugowania bash, ale wydaje się, że nie ma wyraźnej opcji, która mówi, czy oryginalny skrypt został uruchomiony -x
.
[[ $- == *x* ]]
do dopasowania wzorca.case $- in *x*) ... ;; *) ... ;; esac
. Przydatne jest poznanie tego zastosowaniacase
skryptów, które mają być przenośne, a teraz, gdy o tym wiem, łatwiej mi to zapamiętać, niż zapamiętać „jeśli jest to specyficzne dla basha, to[[
inaczejcase
”.$-
wyjściahB
. Co oznaczają-h
i-B
flagi / argumenty zrobić? Nie widzę tego na stronie podręcznika użytkownika bash .set -o
wyświetli,xtrace on
jeśli-x
zostanie użyty, w przeciwnym raziextrace off
.źródło
Chociaż odpowiedź @Patrick jest „właściwa”, możesz również przekazać parametr lub wyeksportowaną zmienną do skryptu podrzędnego, który mówi jej, co ma robić - na przykład włączyć śledzenie.
Ma to tę wadę, że (uważam) musisz ponownie wyeksportować go na każdy poziom skryptu, który zamierzasz wprowadzić.
Ma tę zaletę, że może selektywnie śledzić (lub w inny sposób wpływać) tylko skrypt (y), z których potrzebujesz dane wyjściowe / zmodyfikowane zachowanie - aby ograniczyć zbędne dane wyjściowe itp. Np. Śledzenie może być wyłączone dla skryptu wywołującego i nadal będzie włączony w wywoływanym skrypcie. To nie jest propozycja wszystkiego albo nic.
Nie jest częścią twojego pytania, ale dotyczy:
Czasami definiuję zmienną taką jak
lub
i użyj go (w wielu instrukcjach) jak
lub tylko dla drugiej odmiany
Następnie po prostu komentuję drugą definicję, kiedy chcę, aby polecenia były uruchamiane. Możesz również użyć tej techniki zamiast parametru lub wyeksportowanej zmiennej.
W obu przypadkach należy uważać na instrukcje złożone, ponieważ gwarantuje się, że metoda będzie działać tylko na pierwszej instrukcji na liście złożonej.
źródło
Możesz pobrać PID procesu, a następnie zbadać tabelę procesów za pomocą ps, aby zobaczyć, jakie były argumenty.
źródło
-x
został ustawiony w skrypcie, nie zostanie wyświetlony wps
wyniku. To rozwiązanie i tak jest nieefektywne.set -o
rozwiązanie, które zaproponowałem. Powinien także działać w przypadku opcji, które nie mają powiązanej flagi-x
.