スクリプトがあります
[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
とても奇妙な行動です。しかし、その後には論理があります。
bash
スクリプトを1行ずつ読んでください。最初のステートメントは置き換える内容がないため、awk
同じ内容で新しいファイルを作成します。skrypt.sh
2番目のステートメントは(単一置換)でawk
置き換えられます。だからawk
#awk
次へ追加キャラクター。次に、bash
ファイルの残りの部分を読んでください。オフセットは行末(2番目のawk
ステートメント、4行)にあります。ところで今は行が少し長くなりました(一文字)。したがって、bashは単一行の残りの行を読み取りますh
。これはコマンドでスレッド化されます(なぜなら、私たちはスクリプトbash
にあり、改行で終わるからです)。もちろん、これはh
有効なコマンドではないため、エラーメッセージが表示されます。
目的を達成するには(スクリプトが非常に不安定な場合を除き)、コマンドで解釈できない文字(スペース()など)を4行目の末尾に追加します。
最後に重要なのは:
スクリプト内のスクリプトは編集できません。