1

を使用して回答

source ~/.bashrc

シバンの後-b/cスクリプトは非対話型端末で実行されています-そして、これを.bash_profileにソースしていません

これは、対話型端末で実行されるコードが、非対話型端末で実行されるコードとは異なる動作をする可能性があることを意味します...さて、当面の質問のために...

フォルダーに表示されたら、2 つのファイルを取得しようとしていて、名前を「file_list」に入れようとしています

次に、file_list が繰り返され、ファイルが 1 つずつ上から下に処理されます。

一方は他方よりも前に処理する必要があり、これはその日付を早くすることによって行われます。つまり、「ls」を使用して、アルファベット順で早く表示されるものが、file_list に最初に書き込まれます。

ファイル名は次のとおりです。

foo_bar_09172013.foo
afoo_bar_09172013_ZERO.foo

(通常、文字 'a' が前に付くファイルの方が日付が早く、文字 'a' はありません。そのため、他のファイルの前にアルファベット順で配置することを期待しているため、最初に処理されます) (その日付は今は同じなので、今のところソートするために文字「a」を前に付けています)

file_list は次のように記述されています。

foo_bar_09172013.foo
afoo_bar_09172013_ZERO.foo

並行プロセスを介して実行されるプログラムによって --

このプログラムをシェルから実行すると、正しく実行されます...そしてファイルが次のようにリストされます

afoo_bar_09172013_ZERO.foo
foo_bar_09172013.foo

-- まず、for i の代わりに while read を使用する必要があります -- しかし、今はできません。

-- 第二に、私がこれまでに見た唯一のものは、「対話型」端末と「非対話型」端末です...

スクリプトが正常に実行されているように見える場合もあれば、ファイルが逆にリストされている場合もあります。理由がわかりません。

スクリプト:

for FILE in $(ls *.foo 2> /dev/null)

do
  echo $FILE >> file_list
done

--

TL;DR -- file_list を実行すると、ファイルがアルファベット順に一覧表示されません。これを端末ウィンドウから直接実行すると機能しますが、別のアプリケーションで並行プログラムとして実行すると機能しません。

編集:これはchepnerの変更後の完全なコードです-これは機能しません-

check_for_files()
{

mv $fooSHARE/*.foo $INFILEDIR
cd $INFILEDIR
chmod 777 *.foo
ls *.foo


rm -f file_list 2> /dev/null
for FILE in *.foo


do
      echo $FILE >> $INFILEDIR/file_list
done
}
4

1 に答える 1

1

bash のグロブがアルファベット順にソートされたリストを返すという事実を利用できます[Ref]。したがって、これを実行してソート済みリストを作成できます。

printf "%s\n" *.foo >> file_list
于 2013-09-17T19:20:24.787 に答える