「<」、「<<」、ファイルの読み取り情報[閉じる]

「<」、「<<」、ファイルの読み取り情報[閉じる]
  1. 私はそれができることを知っていますtr a b < file。しかし、どうすればいいですかls?たとえば、ls -l「ファイル」からファイルのリストを提供する方法です。以下の方法を試しましたが、成功しませんでした。

    $ cat>test
    A
    B
    C
    $ ls -l < test
    
  2. 「<<」または本書の目的は明確ではありません。

  3. 私のクラスの練習の1つは、viを使用して、「:」を含む行1と「6/3」を含む行2を持つファイルを作成することです。行 1 を区切り文字として使用し、行 2 をフィールドとして使用して、ファイル内の列 2 をカットして表示します。

これらの2行を繰り返し読んで変数として読む必要がありますか?私はそれを使用しますかsed -n '#p' (file)?エレガントな1ラインソリューションはありますか?

答え1

簡単な方法は次のとおりです。

ls -ld -- $(< file )

(家庭kshまたは互換性のあるシェル)

しかし、ファイル名にスペースやワイルドカードが含まれるなど、いくつかの問題があります。したがって、他の方法を使用することをお勧めします。

xargs -rd '\n' ls -ld -- < file

xargs(これは-rこれらとオプションのGNU実装を想定しています-d)。

答え2

  1. ls標準入力から読み取られないため、入力リダイレクトは何もしません。あなたが望むのはコマンドの置き換えです。

    ls -l `cat list`
    

    または

    ls -l $(cat list)
    
  2. ここにあるドキュメントは、別のファイルではなくスクリプトに提供された固定文字列に標準入力をリダイレクトする方法についてです。コマンドラインでもこれを行うことができますが、これは価値が限定的で一般的ではありません。

  3. これはまったく論理的ではありません。

答え3

最初の部分への答え:

  1. whileループを使用してファイルの内容を「ls」コマンドに渡すことができます。

    while read line ; do
    ls -l $line 
    done < file
    
  2. 汚れた方法:

    counter=1
    while read line ; do
        if [ $counter -eq 1 ] ; then 
            delimiter=$line
            counter=$((counter+1))
        elif [ $counter -eq 2 ] ; then
            field=$line
            counter=$((counter+1))
        else
            echo File ended.
        fi
    done < inputfile
    

関連情報