簡単な答え:一重引用符の代わりに二重引用符を使用してください(@Pavelが提案したように)。疑わしい場合はset -x
、シェルがコマンドをどのように解析しているかを調べるために使用します。
長い答え:引用符はコマンドに渡されません。代わりに、引数がコマンドに渡される前に、シェルによって解析(および削除)されます。彼らがすることは、シェルが引用符の中にあるものを解析する方法を変更することです(通常、一部の文字の特殊な意味を抑制することによって)。つまり、解析したい特殊文字を許可するために適切な引用符を選択し、それらを抑制する必要があります単なる文字として扱いたい。たとえば、次のコマンドについて考えてみます。
R CMD BATCH --no-save --no-restore --slave '--args 2 Vocab May12' tabulate.r /dev/tty
シェルは、コマンドの一重引用符で囲まれたセクションにあるすべての文字の特別な意味を無視します。特別な意味を持つ唯一の文字はスペースです。スペースは通常、引数間の区切り文字として機能します。この場合、一重引用符により、シェルはそれらを単一の引数の一部として扱います。これらの他のコマンド:
R CMD BATCH --no-save --no-restore --slave "--args 2 Vocab May12" tabulate.r /dev/tty
R CMD BATCH --no-save --no-restore --slave --args' '2' 'Vocab' 'May12 tabulate.r /dev/tty
R CMD BATCH --no-save --no-restore --slave --args\ 2\ Vocab\ May12 tabulate.r /dev/tty
...すべて(何らかの方法で)シェルがスペースを引数間の区切り文字ではなく引数の一部として扱うため、すべてがまったく同じことを行います。
それでは、機能していないコマンドを見てみましょう。
R CMD BATCH --no-save --no-restore --slave '--args $1 $2 $3' tabulate.r /dev/tty
問題は、一重引用符が(必要に応じて)スペースの特別な意味を抑制している一方で、(不要な)$
sの特別な意味も抑制していることです。したがって、より選択的なものが必要です。$1
1つのオプションは、スペースを引用符で囲む/エスケープするが、その他は引用符で囲まないままにすることです。
R CMD BATCH --no-save --no-restore --slave --args' '$1' '$2' '$3 tabulate.r /dev/tty
R CMD BATCH --no-save --no-restore --slave --args\ $1\ $2\ $3 tabulate.r /dev/tty
(これらのコマンドはどちらもまったく同じことを行うことに注意してください。)これらはほとんど機能しますが、問題が発生する可能性があります。シェルは$1
スクリプトの引数などを置き換えますが、追加の解析を行います。 :引数の区切り文字として使用するスペース、ファイル名の照合を行うワイルドカードなどを探します。引数には特殊文字が含まれない可能性があるため、これはおそらく含まれないでしょうが、すべてのことは必要ないと確信しています。問題になる。おそらく。
私が見る最良のオプションは、単に二重引用符を使用することです。
R CMD BATCH --no-save --no-restore --slave "--args $1 $2 $3" tabulate.r /dev/tty
二重引用符は、スペースの特別な意味を(必要に応じて)抑制し、$
変数の展開を(必要に応じて)トリガーできるようにしますが、変数が展開された後(おそらく必要に応じて)それ以上の解析を防ぎます。引数のスペースやその他の面白い文字は、Rスクリプト内で問題を引き起こす可能性がありますが、少なくともこれにより、Rスクリプトが開始される前に問題が発生するのを防ぐことができます。