Portál AbcLinuxu, 6. května 2025 20:16

Dotaz: BASH: jak na výpis příkazu, který se bude provádět

svido avatar 5.3.2015 08:58 svido | skóre: 28
BASH: jak na výpis příkazu, který se bude provádět
Přečteno: 465×
Odpovědět | Admin
Ahoj, mám skript, který automatizovaně pracuje s MKV kontejnery a upravuje je podle mých požadavků. Rád bych při zapnutém verbose módu viděl i jednotlivé prováděné příkazy, ale nějak se mi to nedaří...
CMD_EVAL="$APPLICATION_MKVINFO $ACTUAL_PROCESSED_DIRECTORY/$SOURCE_FILE | grep -B4 'Track type: video' | grep 'Track number' | awk '{print \$5}'"
logCommand $CMD_EVAL
VIDEO_TRACK_NUMBER=$(eval $CMD_EVAL)
Do proměnné VIDEO_TRACK_NUMBER by se mělo uložit číslo ID video stopy, ale něuloží.

Zápis pomocí evalu používám hlavně kvůli skládání příkazu - pokud má MKV např. více audio stop, generuje se příkaz dynamicky.

Děkuji za nápady :-)
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.3.2015 09:12 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Odpovědět | | Sbalit | Link | Blokovat | Admin
bash -x
5.3.2015 09:18 NN
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Odpovědět | | Sbalit | Link | Blokovat | Admin
Verbosity prikazu mkvinfo? Jednotlive provadene prikazy shellu?
svido avatar 5.3.2015 09:48 svido | skóre: 28
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
nene, verbosity myslím pro můj skript. Standardně si vypisuji jen některé informace, ale pokud pustím skript s verbosity, mám rozšířené informace a v tomto výpisu bych rád měl i příkazy které se pustí.

Jinak samotné spuštění příkazů ve skriptu má potlařený výstup a jen kontroluji návratovou hodnotu. Nepoužívám jen mkvinfo, ale iconv, enkódování atd.
5.3.2015 11:12 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Vždyť ti říkám - bash -x

Do shebangu na prvním řádku skriptu přidej k bashi parametr -x
svido avatar 5.3.2015 22:52 svido | skóre: 28
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
nerozumíš mi, nechci tracovat bash, ale můj vlastní skript, kdy si verbose mode řídím příznakem a protože dost příkazů, které skript spuští se generují dynamicky, rád bych při zapnutém ukecaném řežimu ty příkazy viděl. O to mi jde
5.3.2015 23:22 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
if [ "$debug" ]; then
   echo "prikaz --parameter --parameter..."
fi

prikaz --parameter --parameter...
6.3.2015 07:14 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Asi opravdu nerozumím. V tom skriptu tím parametrem řekneš bashi, aby ti vypisoval, co dělá, tedy i co konkrétně spouští. Přesně právě v situacích, kdy chceš vidět, co se opravdu spouští. Vyzkoušel sis to?
svido avatar 6.3.2015 13:17 svido | skóre: 28
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
ano, znám to. Když dám #!/bin/bash -x, dostanu sice verbose mode, ale pro bash, který mne moc nezajímá. Vidím toto:
hurvajs@htpc ~ $ ~/bin/mkvmerger.sh --verbose                                                                                              
+ VERSION=0.1-alpha1                                                                                                                      
++ basename /home/hurvajs/bin/mkvmerger.sh                                                                                                
+ SCRIPT_NAME=mkvmerger.sh                                                                                                                
+ PREFIX_VERBOSE_MESSAGE='---> '                                                                                                          
+ PREFIX_MESSAGE='  '                                                                                                                     
+ PREFIX_COMMAND_VERBOSE_MESSAGE='---> CMD - '                                                                                            
+ LOCK_FILE=mkvmerger.sh.lock                                                                                                             
+ SCRIPT_CONFIGURATION_FILE=mkvmerger.conf                                                                                                
+ DATE_FORMAT='%Y/%m/%d %H:%M:%S'                                                                                                         
+ SEPARATOR_PROCESSED_FOLDER='\n----------------------------------------------------------------------------------'                        
++ which mkvinfo                                                                                                                           
+ APPLICATION_MKVINFO=/usr/bin/mkvinfo                                                                                                      
++ which mkvextract                                                                                                                         
+ APPLICATION_MKVEXTRACT=/usr/bin/mkvextract                                                                                                
++ which mkvmerge                                                                                                                           
+ APPLICATION_MKVMERGE=/usr/bin/mkvmerge                                                                                                      
++ which iconv                                                                                                                                
+ APPLICATION_ICONV=/usr/bin/iconv                                                                                                                
++ which enca                                                                                                                                     
+ APPLICATION_ENCA=/usr/bin/enca                                                                                                                  
+ AUDIO_POSSIBLE_LANGUAGE=('eng' 'cze')                                                                                                           
+ AUDIO_PREFERRED=eng                                                                                                                               
+ SUBTITLE_POSSIBLE_LANGUAGE=('cze' 'eng')                                                                                                            
+ SUBTITLE_PREFERRED=cze                                                                                                                              
+ SUBTITLE_ENCODING=utf-8                                                                                                                                                              
+ FLAG_VERBOSE_MODE=0                                                                                                                                                                  
+ FLAG_NO_NEW_LINE=0                                                                                                                                                                   
+ DEBUG_MESSAGE_VIDEO=                                                                                                                                                                
+ DEBUG_MESSAGE_AUDIO=                                                                                                                                                                
+ DEBUG_MESSAGE_SUBTITLE=                                                                                                                                                                 
+ DIRECTORY_INPUT=/home/hurvajs/Source/new_processed_movies/uncorrected                                                                                                                        
+ DIRECTORY_OUTPUT=/home/hurvajs/Source/new_processed_movies/corrected
+ TRACKS_TO_EXTRACT_LIST=
+ TRACKS_TO_EXTRACT_COUNT=0
+ IFS='
'
+ COLOR_ESCAPE_SEQUENCE='\033['
+ COLOR_OFF='\033[0m'
+ COLOR_MOVIE_TITLE='\033[4;1;34m'
+ COLOR_COMMAND='\033[44m'
+ COLOR_ERROR='\033[1;31m'
+ COLOR_WARNING='\033[1;33m'
+ COLOR_SUCCESS='\033[1;32m'
++ date '+%Y/%m/%d %H:%M:%S'
+ EVENT_DATE='2015/03/06 13:01:36'
+ trap '{ rm -rf /home/hurvajs/Source/new_processed_movies/uncorrected/mkvmerger.sh.lock; exit 255; }' EXIT
+ ARGUMENTS_SHORT=vhcdV
+ ARGUMENTS_LONG=version,help,help-configuration,debug,verbose
++ getopt -o vhcdV:: --long version,help,help-configuration,debug,verbose:: -n mkvmerger.sh -- --verbose
...
...
což je brutálně ukecaný a zbytečný...

Zkusím to popsat, když pustím můj skript s --verbose zapne se ukecaný režim, kde bych rád vypisoval i příkazy, které pouštím ve skriptu, tj. mkvinfo, enca, iconv atd. které mi vytáhnou informace ze zpracovávaného MKV kontejneru, tak abych mohl kontejner extrahovat a pak složit dle svých požadavků (ENG audio, ENG + CZE titulky, pojmenování kontejneru atd).

Aktuálně mi dělá problém toto (a na to jsem se i ptal):
# internal video tracks
CMD_EVAL="$APPLICATION_MKVINFO $ACTUAL_PROCESSED_DIRECTORY/$SOURCE_FILE | grep -B4 'Track type: video' | grep 'Track number' | awk '{print $5}'"

# tady se zobrazí příkaz
logCommand $CMD_EVAL

# tady by se měl pustit a do proměnné VIDEO_TRACK_NUMBER naplnit ID audio stopy
VIDEO_TRACK_NUMBER=$(eval "$CMD_EVAL")
Problém je u toho awk. Abych docílil toho, že se mi zobrazí správně, musím escapovat $5, tj. \$5. Což je pak zase špatně pro vlastní eval.

6.3.2015 14:41 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Nemusíte to mít zapnuté pro celý skript, lze to podle potřeby zapínat ("set -x") a vypínat ("set +x").
6.3.2015 14:43 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
To jsem ani nevěděl. Super, díky za tip :-)
svido avatar 6.3.2015 17:28 svido | skóre: 28
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
tak to jsem také nevěděl... Hned zkusím. Díky
7.3.2015 22:04 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Ten skript selže když bude nastavenej jinej jazyk prostředí (já mám jména položek česky). Jinak ten $5 musí přežít až do awku ne? Takže musí být escapován proti přiřazení do stringu a pak evalem. Jinak poslední grep a awk by šel nahradit sedem (i když lomítka sedu v evalu jsou na tom podobně jako $5 v awku :-D).
5.3.2015 10:59 chrono
Rozbalit Rozbalit vše Re: BASH: jak na výpis příkazu, který se bude provádět
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mimochodom pomocou programu mediainfo sa dá získať číslo stopy o niečo jednoduchšie:
mediainfo --Output='Video;%ID%' file.mkv
(ak súbor obsahuje viac video stôp, bude potrebné upraviť tú šablónu pre parameter Output)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.