Vraag Hoe bash-scripts maken elke opdracht afdrukken voordat het wordt uitgevoerd?


Ik heb bijvoorbeeld een eenvoudig bash-bestand

#!/bin/bash
cd ~/hello
ls

Hoe kan ik ervoor zorgen dat het elke opdracht weergeeft voordat het wordt uitgevoerd? Het tegenovergestelde effect van "@echo off" in Windows batch-scripting.


74
2018-05-31 13:39


oorsprong


Voor wie op zoek is naar wat de set opties zijn, je kunt ze vinden op deze manpagina. - mkobit
Je kunt shebang gewoon zo uitbreiden #!/bin/bash -x - sobi3ch


antwoorden:


bash -x script

of

set -x

in het script.

U kunt de optie weer uitschakelen met set +x. Als je het gewoon voor een paar commando's wilt doen, kun je een subshell gebruiken: `(stel -x; command1; command; ...;) in


98
2018-05-31 13:44



Ik heb dit altijd met groot succes gebruikt. De uitvoer ziet er een beetje smeriger uit dan je op het eerste gezicht zou verwachten. - Scott Pack
Door in te stellen PS4 je kunt de prompt van aanpassen -x. bijv .: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script (date zal het echter vertragen) - Walter Tross


Deze werken ook:

set -v

of

#!/bin/bash -v

Maar -v drukt de PS4-tekenreeks niet vóór elke scriptregel af en het traceert de stappen van een "voor" -instructie (bijvoorbeeld) niet afzonderlijk. Het echoot opmerkingen terwijl -x dat niet doet.

Hier is een voorbeeld van de uitvoer met -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Hier is het resultaat van hetzelfde script met -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Merk op dat ik "echo -n" heb toegevoegd om de nadruk te leggen op de verschillen tussen -v en -x. Ook is -v hetzelfde als "-o verbose", maar de laatste lijkt niet te werken als onderdeel van een shebang.


22
2018-05-31 15:28



Geweldige uitleg! zonder onderzoek te doen, lijkt het mij dat Verbose en eXplicit waar deze twee letters voor staan. - Ape-inago
Ik denk dat x dichter bij eXecute staat. - Steven Parkes


Dit zou ook moeten werken:

#!/bin/bash -x
cd ~/hello
ls

10
2018-05-31 14:18





Dit zou moeten werken:

set -o verbose #echo on
...
set +o verbose #echo off

5
2018-05-31 13:44





set -o xtrace en set +o xtrace zijn je vrienden (het is meer uitgebreid, dan -o verbose, en de uitvoer gaat naar STDERR, in tegenstelling tot uitgebreid, wat lijkt te loggen bij STDOUT).

Bekijk meer tips hier


4
2018-06-10 12:45





Er zijn een paar manieren.

#!/usr/bin/env bash -x

als de shebang-lijn.

Inclusief set -x in het script zelf zal de functionaliteit ingeschakeld zijn set +x zal het uitschakelen. Beide methoden zullen ook werken met de meer draagbare sh-shell.

Als ik me goed herinner, heeft perl ook de optie -x.


3
2018-05-31 19:09





gaat als

language -x script

taal = python, perl, bash -x = operator script = bestandsnaam

hoop dat het helpt.


2
2018-05-31 16:12



-x heeft niets te zeggen in Python - Eugene Pankov


#! /bin/bash -x doet wat je wilt.


0
2018-06-11 11:16