linux - unix - 如果同时执行,则 shell 脚本不会以正确的顺序执行

标签 linux bash shell awk aix

<分区>

我在 AIX 7.1 中编写了 shell 脚本,但它没有按正确的顺序执行。

shell脚本是

receive 2 parameter $param and $filename

listoffiles='ls ${param}/*.txt'
awk 'FNR-1' ${listoffiles} >> ${param}/${filename}
mv ${param}/*.txt ${param}/archive

我的目标是将 ${listofffiles} 中的行合并到一个文件中,不包括每个文件的标题。 之后,我想移动 ${listofffiles} 文件,包括生成的 ${param}/${filename} 到一个文件夹(假设它是“存档”文件夹)。 ${filename} 应引用参数,并为每次执行调用提供唯一的文件名,并且始终具有“.txt”扩展名。

问题是:如果有3个(或更多)脚本同时执行,结果会是:

  1. 一次执行将导致正确的顺序

  2. 其他执行将导致 mv ${param}/*.txt ${param}/archiveawk 'FNR-1' ${listofffiles 之前先执行} >> ${param}/${文件名}

我在这里做错了什么?或者有什么方法可以保证脚本严格执行它的步骤? (我尝试添加 &&; 但结果保持不变)

最佳答案

不要对名称进行硬编码,例如 combine.txt;相反,使用 mktemp 为您的实例创建一个唯一的临时文件:

tempfile=$(mktemp "$param/combine.XXXXXX")
awk 'FNR-1' "$param"/*.txt >"$tempfile"
mv "$tempfile" "$param/archive"

使用唯一的文件名将允许脚本的并发实例在不相互交互的情况下运行。

关于linux - unix - 如果同时执行,则 shell 脚本不会以正确的顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27435929/

相关文章:

linux - 是否有一个 gettext 实用程序允许我通过提供一个 msgid 和一个新的 msgstring 作为参数从命令行更改 PO 文件?

ruby - 检测是否安装了 git 的独立于平台的方法

c++ - 使用 GDB 调试从 shell 脚本调用的 C++ 程序

linux - 获取星期一和星期日等一周的任何日期作为 Unix 中的参数

php - 如何在 shell 中递归正则表达式重命名?

linux - 尝试使用 grep 匹配同一行上的多个模式

bash - 在 bash 脚本中获取 SSH 登录名

bash - 流水线 |在 bash 用法中?

c++通过系统在shell中运行curl

python - Jupyter 内核和 Python 之间的不同行为