1

通过使用回答

source ~/.bashrc

在shebang之后-b / c脚本正在非交互式终端中运行-我的.bash_profile中没有此来源

这意味着在交互式终端中执行的代码可能与在非交互式终端中执行的代码行为不同......现在手头的问题......

我(曾经)试图获取两个文件,一旦它们出现在一个文件夹中,并将名称放入“file_list”

然后 file_list 将被迭代,文件将被一个一个地处理,从上到下。

一个必须在另一个之前处理,这是通过使其日期更早来完成的-因此通过使用“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

由通过并发进程运行的程序——

如果我从 shell 运行这个程序,它会正确运行......并将文件列为

afoo_bar_09172013_ZERO.foo
foo_bar_09172013.foo

--首先,我应该使用 while read 而不是 for i -- 但我现在不能。

--其次,到目前为止,我所看到的唯一与此交易的是“交互式”与“非交互式”终端......

该脚本有时似乎正常执行 - 其他时候文件向后列出。我不知道为什么。

剧本:

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

do
  echo $FILE >> file_list
done

--

TL;DR - 一旦我 vi 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 中的 glob 返回按字母顺序排序的列表[Ref]的事实。所以你可以这样做来创建排序列表:

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