【发布时间】:2017-08-04 03:21:24
【问题描述】:
短版: 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 不一定(而且 AFIK 通常确实不会)首先将整个脚本读入内存,但可以稍后加载其中的一部分,只记住文件中要继续的位置。
-
我已将此案例添加为工单的更新。如果用户在 Windows 上更改了 EOL,则会出现错误。