trap
Bashでsignalコマンドを使用する方法を学びたいと思います。このtrap
コマンドは使いやすいですが、私を悩ませる質問は、一重引用符と二重引用符を使用することの重要性です。
コマンドで使用される一重引用符と二重引用符の違いは何ですか
trap
?2つの用途の違いを明確に示すために、いくつかの簡単な例を挙げることができますか?
答え1
このtrap
コマンドは文字列をシェルコマンドとして扱います(たとえばeval
、文字列は拡張のために処理されるため、二重引用符と一重引用符の違いは最初の拡張が発生したときなど)。二重引用符はトラップが設定されたときに発生し、一重引用符はトリガーされたときに発生します。
たとえば、次はbreakにfoo=1
印刷されますが、read
単一引用符を使用すると次のように印刷されますfoo=2
。
#!/bin/bash
foo=1
trap "echo foo=$foo; exit" INT
foo=2
read # hit Ctrl-C here
もちろん、二重引用符を使用しても、生成されたコマンドはトラップが実行されると拡張されるため、上記foo=$0
のトラップの前の行でスクリプトが中断されたときにスクリプト名が印刷されます。