您可以在运行过程中编辑Shell脚本,并使更改影响正在运行的脚本吗?
我对csh脚本的具体情况感到好奇,因为我有该批处理运行一系列不同的构建风格并整夜运行。如果在操作过程中发生什么事情,我想加入并添加其他命令,或注释掉未执行的命令。
如果不可能,是否有任何外壳或批处理机制可以使我做到这一点?
当然,我已经尝试过了,但是要知道它是否有效还需要几个小时,而且我对幕后正在发生或未发生的事情感到好奇。
您可以在运行过程中编辑Shell脚本,并使更改影响正在运行的脚本吗?
我对csh脚本的具体情况感到好奇,因为我有该批处理运行一系列不同的构建风格并整夜运行。如果在操作过程中发生什么事情,我想加入并添加其他命令,或注释掉未执行的命令。
如果不可能,是否有任何外壳或批处理机制可以使我做到这一点?
当然,我已经尝试过了,但是要知道它是否有效还需要几个小时,而且我对幕后正在发生或未发生的事情感到好奇。
Answers:
脚本不能那样工作;执行副本独立于您正在编辑的源文件。下次运行脚本时,它将基于源文件的最新保存版本。
将这个脚本分成多个文件,然后分别运行它们可能是明智的。这样可以减少执行失败的时间。(即,将批处理分成一个构建风味脚本,分别运行每个脚本以查看引起问题的脚本)。
它确实影响了至少我环境中的重击,但是以非常不愉快的方式。请参阅这些代码。首先a.sh
:
#!/bin/sh
echo "First echo"
read y
echo "$y"
echo "That's all."
b.sh
:
#!/bin/sh
echo "First echo"
read y
echo "Inserted"
echo "$y"
# echo "That's all."
做
$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh # while 'read' is in effect
$ # Then type "hello."
就我而言,输出始终为:
你好 你好 就这样。 就这样。
(当然,自动化它要好得多,但是上面的示例是可读的。)
[编辑]这是不可预测的,因此很危险。在最好的解决方法是 ,这里所描述 都放在一撑,而右括号之前,把“退出”。仔细阅读链接的答案,避免陷入陷阱。
[添加]确切的行为取决于一个额外的换行符,并且可能还取决于您的Unix风格,文件系统等。如果您仅想查看一些影响,只需在b.sh之前和/或之后添加“ echo foo / bar” “读取”行。
b.sh
添加10行echo foo / bar / baz 即可扩大。dave4220和我的回答的要点是效果不容易预测。(顺便说一句,名词“喜爱”是指“爱” =)
试试这个...创建一个名为的文件bash-is-odd.sh
:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
这表明bash确实是在“随行”解释脚本。确实,编辑长时间运行的脚本会产生不可预测的结果,插入随机字符等。为什么?因为bash从最后一个字节位置读取,所以编辑会移动当前正在读取字符的位置。
总之,由于这种“功能”,Bash非常非常不安全。svn以及rsync
与bash脚本一起使用时特别麻烦,因为默认情况下,它们会“合并”结果...就地编辑。rsync
具有解决此问题的模式。svn和git没有。
我提出一个解决方案。创建一个名为/bin/bashx
:
#!/bin/bash
source "$1"
现在使用#!/bin/bashx
您的脚本,并始终使用bashx
而不是来运行它们bash
。这解决了该问题-您可以安全地rsync
编写脚本。
@ AF7提出/测试的替代(在线)解决方案:
{
# your script
}
exit $?
大括号可防止编辑,退出可防止附加。当然,如果bash带有-w
(整个文件)之类的选项,或者这样做的话,我们所有人都会好很多。
好问题!希望这个简单的脚本有帮助
#!/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"
在Linux下,如果您键入得足够快,似乎对正在执行的.sh所做的更改是由正在执行的脚本制定的!
我没有安装csh,但是
#!/bin/sh
echo Waiting...
sleep 60
echo Change didn't happen
运行该命令,快速编辑最后一行以阅读
echo Change happened
输出是
Waiting...
/home/dave/tmp/change.sh: 4: Syntax error: Unterminated quoted string
r
我想对Shell脚本的编辑要等到重新运行后才能生效。
Change didn'ned
。
如果全部都在一个脚本中,那么否将不起作用。但是,如果将其设置为调用子脚本的驱动程序脚本,则可以在调用子脚本之前或在循环播放之前更改子脚本,在这种情况下,我相信这些更改将反映在执行中。
我没有听到...但是关于间接的情况:
BatchRunner.sh
Command1.sh
Command2.sh
Command1.sh
runSomething
Command2.sh
runSomethingElse
然后,您应该能够在BatchRunner处理正确之前编辑每个命令文件的内容?
要么
较干净的版本将使BatchRunner查找单个文件,该文件将一次连续运行一行。然后,当第一个文件运行正确时,您应该能够编辑第二个文件?
使用Zsh代替脚本。
在AFAICT中,Zsh不会表现出这种令人沮丧的行为。
通常,在脚本运行时很少会对其进行编辑。您要做的就是对您的操作进行控制检查。使用if / else语句检查条件。如果某件事失败,则执行此操作,否则执行该操作。那是要走的路。