2017-08-31 7 views
3

に意図したとおりに動作しない、私は別の後にディレクトリ内のすべてのファイルを一行をリストしたい、のls -1 CSH

#!/bin/sh 
MY_VAR="$(ls -1)" 
echo "$MY_VAR" 

これは、通りに動作しますが、次のように私はサンプルシェルスクリプトを使用していたためただし、次のようにcshを使用して同じ処理を実行した場合、次のようにcshを使用して実行すると、1行に1ファイルを出力するよりも1行ですべてのファイルを出力します。

csh ls -1が期待どおりに動作しない理由を説明することはできますか。 man cshから

+1

必須の読書[有害と考えられるCshプログラミング](http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)。その後、 'bash'または[zsh](http://zsh.org/) –

+1

に切り替えますか? 'ls -1'は完全に動作します。これは、動作しないコマンド置換です。複数の行を発行した他のコマンドは、同じ動作をします。 –

答えて

1

、重点鉱山:

コマンド置換

コマンド置換は ``」で囲まれたコマンドで表示されます。 このようなコマンドからの出力 は、空白で別の単語に分割され、 のタブと改行になり、nullワードは破棄されます。出力は、元の文字列の代わりにvari- ableおよびcommandで置き換えられます。

コマンド置換( `" ')二重引用符内部ブランクを保持し、 タブ、改行だけが新しい単語を強制単一最後の改行は、いずれの場合にも 力新しい単語をいないことは、コマンドのことが可能です。デフォルトでは、

。コマンドは 完全なラインを出力した場合でも、単語の一部だけを得るために stitutionをサブバージョン6.12置き換え、すべての改行以降のシェルとスペースでコマンドで riageリターン文字をCAR-。これを切り替えると、csubstnonlの設定を解除して をオフにすると、改行はコマンドをuスアル。

エントリはリストで割り当てられます。例えば1つのエントリにアクセスすることができます。 echo $MY_VAR[2]

これは "リスト"の概念を持たないBourneシェルとは異なり、変数は常に文字列です。

foreachループ使用し、単一のライン上のすべてのエントリを印刷するには:これはあなたがスペースを含むファイル名を持っている場合、それが正しく動作することを確認しますよう`ls -1`の周りに二重引用符を追加

#!/bin/csh 
set my_var = "`ls -1`" 

foreach e ($my_var) 
    echo "$e" 
end 

は、推奨されます(そうでなければ、そのようなファイルは2つの単語/リスト項目として現れるでしょう)。