[英]Is it possible to Look at the the original content of a running but modified bash script?
[英]Is it possible in a bash script to change it's content while it's running?
简短版:在bash脚本运行时是否可以更改其内容?
长版:我有一个bash脚本,我想在运行时将其EOL从CRLF'\\ r \\ n'更改为LF'\\ n'。 目前,到目前为止,我能做的就是将这一行放在脚本的顶部:
sed -i -e "s/\r$//g; s/^sed -i -e/#sed -i -e/g" $(basename $0); echo "Rerun again.." ; exit 0;
但这肯定是不切实际的。
我在想,当脚本在第一行中运行时,它将创建一个子shell,并将当前shell的内容放在此处,进行一些更改,然后将其放回上层shell中。 有可能吗?
做同样的想法,但是要在新的临时脚本中创建当前脚本的副本:
cat $0 > temp.sh
然后,主脚本将执行temp.sh,在脚本完成之后,它将temp.sh的副本捕获回主脚本并删除temp.sh。 我认为这在理论上是可行的,但是我敢肯定有一些更简单的方法。
注意:这与EOL无关,我有一些脚本需要应用相同的功能。
用法示例:该项目涉及在Windows和Linux上运行脚本,如果任何用户在Windows上通过编辑器打开了脚本,它将EOL保存为Windows格式“ \\ n \\ r”,这将在Windows上出现此错误。 :
./script.sh: line 5: syntax error near unexpected token `$'{\r''
'/script.sh: line 5: `foo(){
这就是为什么我在脚本开头使用sed的原因。
不要更改当前正在运行的脚本。
一旦有了一个非常慢的脚本并在执行过程中,我便开始对其进行调整以准备下一次执行。 它开始表现得很奇怪。 在我看来,bash仅读取脚本的开头,然后再读取其他部分。 因此,当我的脚本简短时,开始并不是一个问题,但是随着我的脚本变长,它开始引起问题。
您可以扩展当前的尝试:
[[ -z "$CANARY" ]] && { sed -i -e 's/\r$//g' "${BASH_SOURCE[0]}"; CANARY=1 exec "${BASH_SOURCE[0]}"; }
本质上,您需要测试一些变量,进行修改,然后在设置变量时使用修改后的源重新执行。
您还可以source
它,而不是exec
ING,而不是修改实际的脚本文件:
[[ -z "$CANARY" ]] && { CANARY=1 source <(sed 's/\r$//g' "${BASH_SOURCE[0]}"); exit }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.