【问题标题】:Run all shell scripts in folder运行文件夹中的所有 shell 脚本
【发布时间】:2016-12-10 18:57:21
【问题描述】:

我在一个文件夹中有许多 .sh 脚本,我想一个接一个地运行它们。单个脚本可以执行为:

bash wget-some_long_number.sh -H

假设我的目录是/dat/dat1/files

如何才能一个接一个地运行bash wget-some_long_number.sh -H

我知道这些行中的某些内容应该有效:

for i in *.sh;...do ....; done

【问题讨论】:

  • 只需将命令放在do 之后,您的循环变量将是不带扩展名的文件名。显然,这将缺少任何类型的错误处理。如果其中一个脚本失败会怎样?

标签: linux bash shell


【解决方案1】:

使用这个:

for f in *.sh; do
  bash "$f" 
done

如果您想在脚本失败时停止整个执行:

for f in *.sh; do
  bash "$f" || break  # execute successfully or break
  # Or more explicitly: if this execution fails, then stop the `for`:
  # if ! bash "$f"; then break; fi
done

你想运行它,例如,x1.shx2.sh、...、x10.sh

for i in `seq 1 10`; do
  bash "x$i.sh" 
done

保留失败脚本的退出代码(响应@VespaQQ):

#!/bin/bash
set -e
for f in *.sh; do
  bash "$f"
done

【讨论】:

  • @Kirril 你能解释一下break 的作用吗?我不希望工作随时停止。跳过任何失败的脚本并继续下一个。
  • break 停止循环。只需省略|| break
  • 太棒了!谢谢@Kirill Bulygin
  • 为什么是-H? ..to“启用!样式历史替换”来自man bash,或者它是一个未在 man bash 中列出的条件?
  • @alchemy 这不是bash 的选项,而是原始问题(wget-some_long_number.sh -H)中使用的命令的选项。
【解决方案2】:

还有一个更简单的方法,你可以使用run-parts 命令来执行文件夹中的所有脚本:

run-parts /path/to/folder

【讨论】:

  • 它不会执行所有脚本。来自 Debian 上的 man run-parts... the names must consist entirely of ASCII upper- and lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens(注意 .sh. 是不允许的),Other files and directories are silently ignoredrun-parts主要供cron使用,手动使用不可靠。
  • @KirillBulygin,您可以使用类似的选项:--regex 来避免初始命名约束。
  • 那么方法就没有那么简单了吧?
  • 虽然在命名非常特殊的情况下,它确实比 bash 中的正则表达式匹配更简单。
  • run-parts 是为特定目的而设计的;如果您尝试将它用于完全不同的东西,那将不是一个很好的解决方案。当然,如果您不在基于 Debian 的平台上,则该特定工具不存在。无论如何,printf '%s\n' ./* | sh 做了很多相同的事情。
【解决方案3】:

我遇到了这个问题,我无法使用循环,而 run-parts 可以与 cron 一起使用。

答案:

foo () {
    bash -H $1 
    #echo $1
    #cat $1
}
cd /dat/dat1/files #change directory
export -f foo #export foo
parallel foo ::: *.sh #equivalent to putting a & in between each script

您使用 GNU 并行,这会执行目录中的所有内容,并以更快的速度发生增加的 buff。更不用说它不仅仅是脚本执行,你可以在函数中输入任何命令,它会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2019-03-28
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多