繁体   English   中英

在bash脚本运行时是否可以更改其内容?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM