ファイル名の代わりにダッシュ(-)を使用する

コマンドの場合、引数として-を使用する場合ファイル名の代わりにSTDINまたはSTDOUTを意味します。

  1. ただし、この例では、-という名前のファイルを作成します。

    echo hello > - 

    この例の-がSTDOUTを意味するようにするにはどうすればよいですか?

  2. 逆に、次のような例で--という名前のファイルを意味するようにするにはどうすればよいですか。

    cat - 

コメント

  • 直接コメントするには50の評判が必要なようです。 。/dev/ stdin / dev / stdoutコメントで、正当なUNIX派生物であるAIXには、これらの疑似デバイスがありません。そして、さらなるコメントとして、LINUXはいかなる場合でもUNIXの派生物ではありません。これはPOSIX準拠の類似版であり、現時点で最も人気のあるUNIX風のOS 'ですが、間違いなく、これはUNIXではありません。しかし、ここでの返信の要点は正しいです。 "-"表記は、シェルによって特別なものとして解釈されないため、ARGとして個々のアプリケーションに直接渡されます。アプリケーションが認識しない場合
  • 2>&-構造もあります。これは、"記述子2を閉じることを意味します"。
  • @ user95873、言いたかったのは次のとおりです。 LinuxはUnixに似ていますが、すべてのUnixライク(または真のUNIX)がそうであるとは限りません。 Linux 。 Linuxが真のUNIXであるかどうか(つまり、Single UNIX Specificationに準拠)は、' / dev /とは関係ありません。 std {in、out、err}の問題。 / dev / std {in、out、err}は追加機能であり、欠落ではありません。

回答

stdin / stdoutを意味するファイル名として-を使用することは、多くのプログラムで使用される規則です。これはファイル名の特別なプロパティではありません。カーネルは-を特別なものとして認識しないため、ファイル名として-を参照するシステム呼び出しでは-文字通りファイル名として。

bashリダイレクトでは、-は特別なファイル名として認識されないため、bashはそれを文字列ファイル名として使用します。

catが文字列-をファイル名として認識すると、それをstdinの同義語として扱います。これを回避するには、catが参照する文字列を、-というファイルを参照するように変更する必要があります。これを行う通常の方法は、ファイル名の前にパス(./-、または/home/Tim/-)を付けることです。この手法は、コマンドラインオプションがファイル名と衝突する同様の問題を回避するためにも使用されるため、./-eと呼ばれるファイルは-eコマンドラインオプション。

コメント

  • It ' s /dev/stdin/dev/stdoutは世界中で利用可能であり、-コンベンション。
  • @jmtd:/ dev / std {in、out}は普遍的に利用可能ではありません。すべてのUNIXにそれがあるわけではありません。
  • 興味深いことに、それらはPOSIXの一部であると思いました(ただし、'確認できません)。これらは'少なくともLinux、BSD、およびSolarisに存在します。それらが欠けている最新のUNIXの例を挙げていただけますか?
  • @camh通知を受け取ったかどうかはわかりませんが、これは非常に古いトピックです。 'できるかどうかはわかりませんが、' 'の質問ですか? 🙂
  • @jmtd質問に対する暫定的な回答を見つけたようです: unix.stackexchange.com/a/278368/31669

回答

  1. echo hello > -echo hello > /dev/stdoutを使用できます。

    「-」はサポートする各プログラムで実装する必要のある規則ですが、/dev/stdin/dev/stdout、および/dev/stderrは、OSでサポートされている場合(少なくともSolaris、Linux、およびBSDではサポートされます) 、アプリケーションに依存せず、意図したとおりに機能します。

回答

As カム言及-は、一部のプログラムで使用される命名規則にすぎません。シェルが認識するファイル記述子を使用してこれらのストリームを参照する場合は、 jiliagreは正しいという名前を使用する必要があります。代わりに

または/dev/stdout。これらのファイル名は、通常のファイル名が機能する場所であればどこでも機能するはずです。

  1. そうは言っても、最初の例はちょっとばかげています。リダイレクトオペレータがファイルに書き込むためにキャッチする出力は、すでにON標準出力であるため、リダイレクトして元の場所に書き戻すことは無意味です。そこで使用する動作は、リダイレクトではなくパイプです。

    echo hello | 
  2. 2番目の例では、単に缶にいくつかを与える必要があります。内部エイリアスではなく、その名前の文字ファイルが必要であることを示します。これを最も簡単に行うには、次のようにファイルへのパスを指定します。

    cat ./- 

回答

1に関しては、プログラムはそれをサポートする必要があります。勝手に使用することはできません。2については、入力をリダイレクトします(例:cat < -)。

回答

「-」アプローチには多くの問題があります。まず、「-」文字の解釈が必要であり、多くのプログラムはそのような解釈を実行しません。さらに、コマンドラインオプションの終わりを示す区切り文字としてハイフンを解釈するプログラムがいくつかあります。プログラムはファイル名引数で動作するように作成されています。「-」アプローチはハックであり、優れていますが弱いです。

最善の方法は次のとおりです。

$ echo hello > /dev/fd/1 

/dev/stdoutは、/dev/fd/1

コメント

  • リダイレクトは、呼び出されているプログラムではなく、シェルによって解釈されます。

回答

特殊文字には主に2つの意味があります:

ASCII数値チャート。

スクリプトまたは記号。

1つの文字が文字列を表すか、文字列として機能する可能性があります。私の理解では。

C言語fopen()関数は、最初のファイルストリームとファイルが開かれる2番目のモードの2つの引数を取ります。モードは文字列です。1文字であっても。

cat > "-"は機能します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です