を使用して R から Perl を実行しようとしていますsystem
。単純に文字列 (R で提供) を変数に割り当ててエコーします。(system
呼び出しは で実行されます/bin/sh
)
echo <- function (string) {
cmd <- paste(shQuote(Sys.which('perl')),
'-e',
shQuote(sprintf("$str=%s; print $str", shQuote(string))))
message(cmd)
system(cmd)
}
# all fine:
# echo('hello world!')
# echo("'")
# echo('"')
# echo('foo\nbar')
ただし、echo
バックスラッシュ (またはバックスラッシュで終わる任意の文字列) を使用しようとすると、エラーが発生します。
> echo('\\')
'/usr/bin/perl' -e "\$str='\\'; print \$str"
Can't find string terminator "'" anywhere before EOF at -e line 1.
(注: の前のバックスラッシュは、シェル変数であると考えるの$
を防ぐため、問題ありません)。/bin/sh
$str
エラーは、Perlが最後を、エスケープされたバックスラッシュではなく\'
、埋め込まれた引用符として解釈しているためです。$str
実際、perl にバックスラッシュをエコーさせるには、次のようにする必要があります。
> echo('\\\\')
'/usr/bin/perl' -e "\$str='\\\\'; print \$str"
\ # <-- prints this
つまり、Perlのバックスラッシュをエスケープする必要があります(R/bash でバックスラッシュをエスケープすることに加えて)。
echo
ユーザーが入力した文字列が印刷される文字列であることを確認するにはどうすればよいですか? つまり、必要なエスケープのレベルは R レベルだけですか?
つまり、に類似した何らかのperlQuote
機能がありshQuote
ますか? 関数内のすべてのバックスラッシュを手動でエスケープする必要がありecho
ますか? 与えられたエスケープする必要がある他の文字はありますか?