1

次のRubyコードがあります。

cmd="
source= $(mktemp)
echo source
"
system("#{cmd}")
system("source= $(mktemp)")

「mktemp」コマンドを実行し、一時ファイル名を変数「source」に出力するコードが必要でした。ただし、表示されるエラー メッセージは次のとおりです。

sh: /tmp/tmp.EpXeLNkqjN: Permission denied

sh: /tmp/tmp.wVCqdqHSpp: Permission denied


------------------
(program exited with code: 0)
Press return to continue

プログラムをルートとして実行しても、エラーは同じでした。

ただし、mktemp コマンドのみを実行する場合は問題ありません。なにが問題ですか?

4

3 に答える 3

4

=記号にスペースを入れてはなりません。コードを次のように置き換えます

cmd="
source=$(mktemp)
echo $source
"
system("#{cmd}")
system("source=$(mktemp)")

注意:記号の後にスペースを入れないで=ください。

=記号の後にスペースを残すことの問題は、変数が空の文字列に設定された状態で、展開によって指定されたコマンド(つまり、存在しないコマンドまたは類似のもの)shを実行しようとすることです。$(mktemp)/tmp/tmp.EpXeLNkqjNsource

于 2012-12-31T16:03:45.517 に答える
2

問題: 無効なシェル構文

不正な空白、変数の適切な逆参照の失敗、潜在的な IFS または引用符の問題など、コードに多くのエラーがあります。

解決策: 正しいシェル構文を使用する

正当な Bash 構文を使用すると問題なく動作します。例えば:

cmd='source=$(mktemp); echo "$source"'
system(cmd)

私のシステムでは、これにより期待される結果が標準出力に正しく出力され、正しく返されます。たとえば、pry ショー:

/tmp/tmp.of89uLTUqf
=> true

より良い解決策: バックティックを使用する

Kernel#systemを使用してシェルアウトするのではなく、Ruby でバッククォートを使用して変数を代入してみませんか? 例えば:

source = `mktemp`
# => "/tmp/tmp.KVhGMzZRiG\n"

これはより単純で、エラーが発生しにくいようです。

于 2012-12-31T17:22:14.760 に答える
1

ファイルのアクセス許可を実行可能に設定していることを確認してください。

于 2012-12-31T11:18:46.467 に答える