我有一个脚本
[pic@pic Desktop]$ cat skrypt.sh
#!/bin/bash
awk '{sub(/#echo "Wstałem"/,"#echo \"Wstałem\""); print $0 > "skrypt.sh"}' skrypt.sh
awk '{sub(/awk/,"#awk"); print $0 > "skrypt.sh"}' skrypt.sh
[pic@pic Desktop]$
我运行脚本
[pic@pic Desktop]$ ./skrypt.sh
./skrypt.sh: line 5: h: command not found
[pic@pic Desktop]$
为什么会收到消息?
./skrypt.sh: line 5: h: command not found
编辑:
运行脚本后我想得到结果
#!/bin/bash
#awk '{sub(/#echo "Wstałem"/,"#echo \"Wstałem\""); print $0 > "skrypt.sh"}' skrypt.sh
#awk '{sub(/awk/,"#awk"); print $0 > "skrypt.sh"}' skrypt.sh
这只是一个例子。这个想法是,在真正的脚本中,在调用之后已注释掉上面的行。
答案1
非常strace的行为。但背后是有逻辑的。
bash
逐行读取脚本。第一条awk
语句只是用相同的内容写入skrypt.sh
新文件,因为没有任何内容可以替换。
第二条awk
语句替换awk
为#awk
(单一替换)。所以添加一个字符。然后bash
读取文件的其余部分。偏移量位于该行的末尾(第二个awk
语句,第 4 行)。但现在该行有点长(一个字符)。因此 bash 读取该行的其余部分,这是一个单一的h
.这是作为命令进行线程化的(因为我们在bash
脚本中并且它以换行符结尾)。当然h
, 不是有效的命令,因此会出现错误消息。
要完成您想要的任务(除了您的脚本非常不稳定),请在第 4 行末尾添加一个字符,该字符不能解释为命令,例如空格 ( )。
最后但并非最不重要的:
您不得在脚本内部编辑脚本。