Ho un file di nome cmd che contiene un elenco di comandi UNIX come segue:l'esecuzione di comandi che contengono spazio in bash
hostname
pwd
ls /tmp
cat /etc/hostname
ls -la
ps -ef | grep java
cat cmd
ho un altro script che esegue i comandi in cmd come:
IFS=$'\n'
clear
for cmds in `cat cmd`
do
if [ $cmds ] ; then
$cmds;
echo "****************************";
fi
done
Il problema è che i comandi in cmd senza spazi funzionano bene, ma quelli con spazi non sono interpretati correttamente dallo script. Di seguito è riportato l'output:
patrick-laptop
****************************
/home/patrick/bashFiles
****************************
./prog.sh: line 6: ls /tmp: No such file or directory
****************************
./prog.sh: line 6: cat /etc/hostname: No such file or directory
****************************
./prog.sh: line 6: ls -la: command not found
****************************
./prog.sh: line 6: ps -ef | grep java: command not found
****************************
./prog.sh: line 6: cat cmd: command not found
****************************
Cosa mi manca qui?
In realtà, sta avendo il problema opposto.Impostare $ IFS come ha fatto qui fa sì che 'for' si intrometta su newline, esattamente come vuole. Tuttavia, sta tentando di interpretare l'intera stringa come un nome di comando piuttosto che un comando con argomenti. –
+1 per offset downvote. :-) –
invocando bash -c stai iniziando un nuovo processo per ogni comando. Sembra eccessivo e potrebbe avere risultati sorprendenti. Ad esempio, se uno dei comandi è un comando cd, i comandi successivi non verranno eseguiti in quell'altra directory. –