-
誤って(たとえば)というファイルを作成しましたseq 10 > -
。その後、を使用してみようとしましたが、less
動作が停止しました。
less -
私は入力が必須であるため、これが起こることを知っているので、ファイル名としてstdin
解釈されません。-
試してみましたが、less \-
やはり動作しません。
less
それでは、これが-
標準入力ではなくファイルであることを示す方法はありますか?
私が得ることができる最善は次のとおりです。
find -name '-' -exec less {} +
答え1
プレフィックスを追加するだけです./
。
less ./-
またはリダイレクトを使用します。
less < -
-
(たとえば、関連-x
またはたとえば)は--foo--
オプションではなく特殊ファイル名として扱われるため、以下は機能しません。
less -- - # THIS DOES NOT WORK
答え2
ちょうど知っているmv - f && less f
。問題が解決しました。
答え3
メモ:私の答えはいいえOPの場合に機能し、下記の規則に従うツールに対してのみ機能します。ファイル名が(dash)の場合は動作しません。-
これは通常、標準入力から読み取ることを期待するように指定する特別な場合でもあります。許可された回答を参照してください。
これには、人々が回答を見つけたときに偶然に発見できる他の状況に関する有用な情報が含まれているため、ここに残します。
ダブルダッシュ!
--
最後の引数を表示するには、標準のダブルダッシュ()ルールを使用します。
less -- -FILENAME
はい
$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!
シハテ?
この--
主張は、ほとんどのシェルユーティリティとコマンドラインツールの実装でサポートされている規則から来ており、ほとんどのシェルはCLIツールを実装するときに従うべきであると明示的に主張しています。
公開グループのおすすめ
OpenGroupもこの内容に言及しました。ユーティリティ説明デフォルト基本仕様の(v6)部分:
デフォルトの動作:[...]オプションを許可しないがオペランドを許可する標準ユーティリティは、「--」を削除する最初の引数として認識する必要があります。
「--」を認識する必要がある要件は、アプリケーションに準拠する場合、実装が拡張として提供できる任意のオプションからオペランドを保護する方法が必要であるためです。たとえば、標準ユーティリティ foo がオプションなしで一覧表示され、アプリケーションがハイフンの付いたパス名を指定する必要がある場合は、次のことが安全です。
foo -- -myfile
-m を拡張子として使用すると問題は発生しません。
そしてユーティリティ構文ガイド(v7):
ガイドライン10: オプションパラメータではなく、最初の - 引数は、オプションの終わりを表す区切り文字として受け入れる必要があります。後続の引数は、「-」文字で始まってもオペランドとして処理する必要があります。
バッシュおすすめ
以下は、これをサポートする組み込み関数を説明するbashマニュアルから抜粋したものです。
特に断りのない限り、このセクションで説明されている各組み込みコマンドは、オプションの終わりを示すために前に-accepts--を付けたオプションを受け入れます。
:、true、false、および test 組み込み関数はオプションを受け入れず、特に処理しません。終了、ログアウト、中断、続行、許可、および移動組み込み関数は、-なしで-で始まる引数を受け入れて処理します。引数を受け入れるが許可オプションとして指定されていない他の組み込み関数は、 - で始まる引数を無効なオプションとして解釈し、 require - を解釈することで、これらの解釈を防ぎます。
echoは--をオプションの終わりとして解釈しないことに注意してください。