私はbashスクリプトにまったく慣れておらず、かなり順調に進んでいますが、問題が発生しています。
スラッシュ(/)を使用するスクリプトを作成しようとしていますが、エラーメッセージ/: is a directory.
が表示され続けます。コマンドtest/(hello)
をターミナルのプログラムに渡す必要があるので、それを機能させるためにバックスラッシュを追加しました:test\/\(hello\)
、このエラーが発生します。ここで何が問題になっていますか?
コメント
- スクリプトはスラッシュを使用しますか? 引数をコマンド/スクリプトに正常に渡したようですが、スクリプトにエラーがあります。より詳細な例を教えてください。また、 '行番号などについて言及していませんか?
回答
これは、合格していない場合にのみ発生するはずです。引数の前のコマンド。次のようなコマンドを呼び出す必要があります:
command [args ...]
このように呼び出すと、機能します。
$ echo test/\(hello\) test/(hello)
レコードの場合、すべてのメタ文字をエスケープするよりも、引数を引用する方が一般的にはるかに簡単です(そしてはるかに読みやすくなります)。これは、"
と"
(このここに関する適切な情報があります。
コメント
- 賛成。シェルは、スラッシュで区切られたテキストを、コマンド/引数ではなくディレクトリとして解釈します。スラッシュは、たとえばPerlスクリプトの引数で使用できます(
Getopt::Long
を構成するか、独自にローリングする必要があります)が、コマンドと引数の間にスペースが必要です。これはシェルの要件です。
回答
正確な文字列を渡す必要がある場合test/(hello)
をプログラムに挿入するには、一重引用符で囲みます。
someprogram "test/(hello)"
一重引用符を除くすべての文字は、一重引用符で文字通り解釈されます自体。文字列に一重引用符が必要な場合は、"\""
として渡します(リテラル文字列の終了、次の文字の引用、リテラルとして解釈される一重引用符、リテラル文字列の開始)。
echo "Lasciate ogne speranza, voi ch"\""entrate"
これは、ここに表示されるエラーメッセージとは関係ありません。 /: is a directory
は、/
をプログラムとして実行しようとしたことを意味します。おそらく、プログラムへのフルパスを書き込もうとしたが、余分なスペースを残した場所があります。たとえば、
/ path/to/program
他の句読文字が作成されている可能性がありますこれはあまり明白ではないか、そのメッセージの制御文字です。デバッグを容易にするために、スクリプトの2行目の最初の#!
行の直後にset -x
を配置して、シェルが実行するすべての行のトレース。