【问题标题】:bash function not exitingbash函数没有退出
【发布时间】:2021-09-24 15:09:37
【问题描述】:

我尝试了一些在类似帖子中看到的建议,但我的脚本在完成后没有退出。我必须按 Enter 才能退出。它运行一个名为 foo 的函数,并且运行正常。但是当它完成它的写入 Done $i 其中 i 是最后一项,然后只是空格时,我必须按 Enter 键退出。提前谢谢你。

#!/bin/bash

PATH=/opt/conda/bin:$PATH
export PATH


eval "$(conda shell.bash hook)"
conda activate prokka_env &&

foo () {
    local i=$1
    prokka $i --outdir ./"${i%.*}" --prefix "${i%.*}"
    echo Done $i
}

for i in *.fasta; do foo "$i" & done

【问题讨论】:

  • 行尾的&&有什么作用?
  • 为什么&&conda activate 行的末尾?
  • 您是否有意将每个foo "$i" 实例提交为后台进程?
  • 因为它在后台运行所有内容,我认为您的脚本在打印任何 Done $i 消息之前退出,您认为需要按 Enter 的原因只是提示已经向上滚动当Done $i 消息被打印出来时。为了证实这个理论,运行你的脚本,然后尝试输入ls<enter>。如果该命令实际运行,您将知道您的脚本已经正确结束。
  • 我已经删除了 && 并且现在再次对其进行测试。是的,我有意将每个 foo $i 实例作为后台进程提交。它们是独立的进程,希望加快处理时间

标签: bash conda


【解决方案1】:

首先,我假设您打算在conda activate prokka_env 之后使用& 而不是&&(尽管最好不要在后台运行该命令)。

其次,由于您使用& 在后台运行所有foos,因此您需要在脚本末尾添加wait,以便在所有后台任务完成运行后您的脚本将自动结束。

有关wait 的更多信息,请参阅GNU bash manual 中的条目或运行help wait

【讨论】:

  • 我认为在 conda activate 结束时& 是个坏主意 - 应该在任何工作开始之前加载环境。否则很好的答案,wait 是正确的解决方案。
【解决方案2】:

谢谢,添加等待就可以了。这是最终代码,以防其他人发现它有用。

#!/bin/bash

PATH=/opt/conda/bin:$PATH
export PATH


eval "$(conda shell.bash hook)"
conda activate prokka_env

foo () {
    local i=$1
    prokka $i --outdir ./"${i%.*}" --prefix "${i%.*}"
echo Done $i
}

for i in *.fasta; do foo "$i" & done
wait
echo "All jobs completed."

【讨论】:

  • 仅供参考,如果您配置了conda init bash,那么将-l 标志添加到shebang (#!/bin/bash -l) 就可以了,这样您就可以删除conda activate 上面的行。
【解决方案3】:

我认为真正发生的是:

  • 脚本运行
  • 脚本退出
  • 您会看到命令提示符
  • 然后echo Done $i 被发送到标准输出,并且似乎覆盖了命令提示符,同时将光标留在了新行上(没有任何命令提示符)

在这种情况下,脚本已经退出,而您仍坐在命令提示符下,但后台作业的延迟输出使您的程序看起来仍在运行。

考虑:

$ foo () { sleep 3; echo 'Done'; }

$ foo &
$                               # immediately provided with command prompt

三秒后终端的样子:

$ foo &
$ Done                          # the 'Done' is added to the line and ...
                                # cursor is left sitting on blank line 

此时,您仍处于命令提示符下……看起来不像。从这里你可以运行一个命令,例如:

$ foo &
$ Done
date
Fri Sep 24 12:28:05 CDT 2021
$

或者直接点击<return> 获取新的命令提示符,例如:

$ foo &
$ Done
                                # hit <return>
$

正如其他人指出的那样,wait 将阻止脚本退出,直到所有后台作业完成。

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2021-10-10
    • 2011-05-24
    相关资源
    最近更新 更多