如何通过Shell执行TXT文件中的命令?脚本仅执行首命令问题排查
为啥只执行第一个命令就停了?
咱们先把问题根源说清楚:你用的exec命令,在shell里的作用是直接替换当前运行脚本的shell进程,不是创建子进程来执行命令。
当脚本第一次循环到exec pwd时,运行这个脚本的bash进程直接变成了pwd进程,pwd输出完当前目录后,这个进程就结束了——后面的循环(要执行ls)、最后的echo "printed"自然都没机会跑了,这就是你只看到pwd结果的原因。
怎么解决?
想要依次执行文件里的所有命令,根本不需要用exec,直接执行命令就行。shell会自动开子进程跑每个命令,跑完后回到原脚本继续循环。
另外,读取文件时给read加个-r参数会更稳妥——它能避免反斜杠被意外转义,还能处理文件末尾没换行的情况。
修改后的完整脚本
echo "pwd" > temp.txt echo "ls" >> temp.txt exec < temp.txt while read -r line do $line done echo "printed"
(可选)非要用exec的话?
如果出于某些特殊场景你必须用exec,可以让它启动一个子shell来执行命令,这样就不会干掉原脚本的进程:
echo "pwd" > temp.txt echo "ls" >> temp.txt exec < temp.txt while read -r line do exec bash -c "$line" done echo "printed"
不过说实话,这种方法完全没必要,直接执行$line才是最简单高效的选择。
内容的提问来源于stack exchange,提问作者aditya gudipati
相关产品推荐
相关产品推荐

