「-」という名前のファイルを「小さく」するにはどうすればよいですか?


17

誤って名前-(たとえば、seq 10 > -)を持つファイルを作成しました。次にless、表示に使用しようとしましたが、ハングします。

less -からの入力を予期しているため、これが起こっていることを理解しstdinてい-ますので、ファイル名として解釈しません。試しましたless \-が、うまくいきません。

だから、lessそれ-がファイルであり、stdinではないことを示す方法はありますか?

私が得ることができる最高のものは:

find -name '-' -exec less {} +

2
@muruはコメントに感謝しますが、可能性のある重複は非常に具体的であるため、「完全な重複」と見なされるとは思いません。「 '-'で始まるファイルにアクセスする方法」など、より一般的な言葉に書き換えられた場合は、おそらく。
fedorqui

4
それは重複した質問ではありません。-単独の場合は異なります。-オプションではありません。
ステファンシャゼル

1
@terdon同じ答えが直接あるということは、それらが重複していることを意味するとは思いません。Meta SOのどこかに例がありました:質問が「いいえ」で答えられた場合、正解が「いいえ」であるものは重複しますか?前に言ったように、複製の候補をより一般的にするように言い換えることは興味深いでしょう。そうでない場合、このような他の質問を送信することはあまり意味がありません。
fedorqui

4
@terdon、いいえ。そこで受け入れられている解決策はここでは機能しません。いいえ、-オプションとして扱われません。これは、オプションのように形作られる引数の場合とはまったく異なる問題です。
ステファンシャゼル

2
一般的なシェル(少なくともPOSIX準拠のシェル)の特殊文字ではないため-、単一引用符のように囲ん'-'だり、エスケープしたりする必要はありません。結果は同じです。\--
パブーク

回答:


53

プレフィックスを付けるだけ./です:

less ./-

または、リダイレクトを使用します。

less < -

-(とは対照的に、-xまたは--foo--)たとえばオプションではなく特別なファイル名と見なされるため、以下は機能しないことに注意してください。

less -- -   # THIS DOES NOT WORK

3
ところで、それfind -name '-' -exec less {} +が実行されます。
ステファンシャゼル

6
@fedorqui、いいえ、それは-andと./-(または/path/to/-or ../to/-)がその-ファイルへの2つの有効なパスですが、-引数は特別ではありませんがless(stdinから読み取られることを意味します)、./-特別ではありません。
ステファンシャゼラス

2
@fedorqui find -name '-' -exec less {} +はの非標準形式ですfind . -name '-' -exec less {} +。ツリーを降りて.ファイルを見つけ、それらのファイルのパスを引数としてに渡しますless。で置き換え-exec less-exec echo less、実行中のものを確認します。
ステファンシャゼラス

4
@haylem --は、オプションの終わりをマークすることです。ここでは役に立ちません。これ-はオプションではなく、特別な非オプション引数です。unix.stackexchange.com/a/56370、unix.stackexchange.com / a
110756 –StéphaneChazelas

3
@haylem、自分で試してみてください。--オプションの終わりをマークするためにgetopt()によって処理され、getopt()-によってオプションとして認識されないため、提供される-かどうかにかかわら--ず、通常の引数として認識されます。また、通常の引数として、lessほとんどのテキストユーティリティは、それを標準入力として扱いますが、ここでは必要ありません。
ステファンシャゼル


3

注:私の答えはありません OPの場合に有効な、そして唯一の大会は、まさにちょうどという名前のファイルの場合には、以下のといない言及した以下のツールに適用される-標準からの読み取りを指定することもしばしばである(ダッシュ)、特殊なケース入力が期待されます。受け入れられた答えを参照してください。

回答の検索中につまずくかもしれない他のケースのための有用な情報が含まれているので、ここに残してください。


ダブルダッシュ!

--最後の引数を示すには、標準の二重ダッシュ()規則を使用します。

less -- -FILENAME

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

ふぁっぁっと?

この--引数は、シェルユーティリティおよびコマンドラインツールのほとんどの実装でサポートされている規則に由来するものであり、ほとんどのシェルは、CLIツールを実装するときに従う必要があることを明らかに主張します。

Open Groupが推奨

OpenGroup は、基本仕様のUtility description defaults(v6)セクションでも言及しています

デフォルトの動作:[...]オプションを受け入れないが、オペランドを受け入れる標準ユーティリティは、破棄される最初の引数として「-」を認識します。

「-」を認識するための要件は、適合アプリケーションが、実装が拡張として提供する可能性がある任意のオプションからオペランドを保護する方法を必要とするためです。たとえば、標準ユーティリティfooがオプションを使用しないものとしてリストされ、アプリケーションがパス名に先頭にハイフンを付ける必要がある場合、次のように安全に実行できます。

foo -- -myfile

-mを拡張子として使用することによる問題を回避します。

また、ユーティリティ構文ガイドライン(v7)では:

ガイドライン10: オプション引数ではない最初の-引数は、オプションの終わりを示す区切り文字として受け入れられるべきです。後続の引数は、 '-'文字で始まる場合でもオペランドとして扱われる必要があります。

Bashが推奨

ここでは、bashマニュアルからの抜粋、それをサポートするビルトインについて:

特に断りのない限り、このセクションに記載されている各組み込みコマンドは、オプションの終わりを示すために-accepts-で始まるオプションを受け入れます。

:、true、false、およびtestビルトインは、オプションを受け入れず、特に扱いません。exit、logout、break、continue、let、およびshift組み込み関数は、-を必要とせずに-で始まる引数を受け入れて処理します。引数を受け入れるが、オプションの受け入れとして指定されていない他の組み込み関数は、-で始まる引数を無効なオプションとして解釈し、この解釈を防ぐために-を要求します。

エコーは解釈しないことに注意してください-オプションの終わりを意味します。

追加の読書


2
+1:最もポータブルでコマンドに依存しないソリューションで、覚えやすく、「ベストプラクティス」と見なされる
mveroone

2
@Kwaio「ベストプラクティス」に関する参考資料はありますか?気になるだけです。
フェドルキ

24
その答えは、オプションのように見える引数に適用されます。それはのためのケースではありません-オプションではありませんています。を使用して./-可能であれば、またはリダイレクトは、foo=barof awkやthat などの他の種類の問題を回避するため、一般的にはより良いアプローチです-。参照してくださいunix.stackexchange.com/a/56370unix.stackexchange.com/a/110756
ステファンChazelas

7
ステファンが言うように、これは答えない質問を。まだstdinから読み取ろうとします。less -- -
ミチャウポリトウスキ

5
回答を削除する(または他の質問に移動することができます)ここに有用な参照があるので)か、この特定のケースに当てはまらないことを明確にしたい場合があります(そして、どちらがさらに役立つのかを説明します)。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.