您可以在shell脚本运行时编辑它并让更改影响正在运行的脚本吗?
我很好奇csh脚本的具体情况,我有批处理运行一堆不同的构建风格并运行一整夜.如果我在操作过程中发生了某些事情,我想进入并添加其他命令,或者注释掉未执行的命令.
如果不可能,是否有任何shell或批处理机制可以让我这样做?
当然我已经尝试过了,但是在我看到它是否有效之前还需要几个小时,而且我很好奇幕后发生了什么或者没有发生什么.
tei*_*ura 47
[编辑]参见这个答案,第3节了解变通方法.
它确实会影响,至少在我的环境中受到打击,但却非常不愉快.请参阅这些代码.第一a.sh:
#!/bin/sh
echo "First echo"
read y
echo "$y"
echo "That's all."
Run Code Online (Sandbox Code Playgroud)
b.sh:
#!/bin/sh
echo "First echo"
read y
echo "Inserted"
echo "$y"
# echo "That's all."
Run Code Online (Sandbox Code Playgroud)
做
$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh # while 'read' is in effect
$ # Then type "hello."
Run Code Online (Sandbox Code Playgroud)
在我的情况下,输出始终是:
hello hello That's all. That's all.
这是不可预测的,因此是危险的.有关变通方法,请参阅此答案第3节.
[补充]确切的行为取决于一个额外的换行符,也可能取决于你的Unix风格,文件系统等.如果你只是想看到一些影响,只需在b.sh之前和/或之后添加"echo foo/bar" "读"行.
Eri*_*sty 35
试试这个......创建一个名为"bash-is-odd.sh"的文件:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
Run Code Online (Sandbox Code Playgroud)
这表明bash确实是在"你去的时候"解释剧本.实际上,编辑长时间运行的脚本会产生不可预测的结果,插入随机字符等等.为什么?因为bash从最后一个字节位置读取,所以编辑会移动当前正在读取的字符的位置.
总之,由于这个"特征",Bash非常非常不安全.与bash脚本一起使用时,svn和rsync特别令人不安,因为默认情况下它们会"合并"结果......编辑到位.rsync有一个修复此问题的模式.svn和git没有.
我提出一个解决方案.创建一个名为"/ bin/bashx"的文件:
#!/bin/bash
source "$1"
Run Code Online (Sandbox Code Playgroud)
现在在脚本上使用#!/ bin/bashx并始终使用"bashx"而不是bash运行它们.这解决了问题 - 您可以安全地rsync您的脚本.
由@ AF7提出/测试的替代(在线)解决方案:
{
# your script
}
exit $?
Run Code Online (Sandbox Code Playgroud)
卷曲支撑可防止编辑,退出可防止附加.当然,如果bash带有一个选项,比如'-w'(整个文件),或者做了这样的事情,我们都会好得多.
gle*_*man 17
将脚本分解为函数,每次source从单独的文件调用函数时.然后,您可以随时编辑文件,并且您的运行脚本将在下次获取更改时获取更改.
foo() {
source foo.sh
}
foo
Run Code Online (Sandbox Code Playgroud)
小智 5
好问题!希望这个简单的脚本有帮助
#!/bin/sh
echo "Waiting..."
echo "echo \"Success! Edits to a .sh while it executes do affect the executing script! I added this line to myself during execution\" " >> ${0}
sleep 5
echo "When I was run, this was the last line"
Run Code Online (Sandbox Code Playgroud)
在 Linux 下,如果您输入得足够快,对正在执行的 .sh 所做的更改似乎是由正在执行的脚本执行的!
for*_*ord -88
脚本不是这样工作的;执行副本独立于您正在编辑的源文件。下次运行脚本时,它将基于最近保存的源文件版本。
将此脚本分解为多个文件并单独运行它们可能是明智的做法。这将减少执行失败的时间。(即,将批次拆分为一个构建风格脚本,单独运行每个脚本以查看哪个脚本造成了问题)。
| 归档时间: |
|
| 查看次数: |
40424 次 |
| 最近记录: |