macos shell脚本不返回控制

Posted

技术标签:

【中文标题】macos shell脚本不返回控制【英文标题】:macos shell script not returning control 【发布时间】:2021-04-03 06:57:46 【问题描述】:

我在 High Sierra 上运行一个 Perl 脚本,它使用“system”命令调用一个 bash shell 脚本,但它没有将控制权返回给 Perl 脚本。

@sysCmd=('~/bin/2mp3.1.sh');
system(@sysCmd) == 0 || die "system command failed: $?\n";

我对“system”的理解是,与“exec”不同,它应该返回到调用脚本。 bash 脚本:

for i in *.flac ; do
    ~/bin/ffmpeg -i "$i" -acodec libmp3lame "$(basename "$i/.flac")".mp3
    sleep 1
done

一旦完成,Perl 脚本应该会从中断处继续并继续,但没有乐趣。 请欣赏一些想法。我穿着石棉裤以防万一:)

【问题讨论】:

Re "一旦完成,Perl 脚本应该从中断处继续并继续",确实如此。 system 将在 shell 退出后立即返回。 您等待它完成多长时间,当您直接在相同的输入上运行该 bash 程序需要多长时间? 当它在终端中从 CL 运行时,它会在几分钟内完成大约 12 次转换,并返回到提示符。从 Perl 脚本中,我可以看到在 Finder 中创建的 .mp3 文件,但即使它们都已完成,Perl 脚本也不会在应有的地方找到。它似乎以某种方式挂断了脚本。 我已经取出了“睡眠”命令并在完成后添加了“退出 0”。 .mp3 文件已创建,但控制权不会传回给 Perl。 在调用任何其他命令或脚本时,system 是否似乎挂起?将echo 命令放入您的shell 脚本中,以打印出每行之间它在做什么的消息。 system("~/bin/2mp3.1.sh") 有什么不同吗? ~/bin/2mp3.1.sh 真的解析为您认为的文件吗?什么是 shell 脚本的 shebang 行?我只是在想办法限制问题。 【参考方案1】:

找到运行脚本的perl命令的tty,然后执行:

tty=ttyOfPerlCommandRunningYourScript
while [ 1 ]; do
   clear
   date
   ps -ft $tty
   sleep 1
done

如果 perl 脚本的 tty 类似于/dev/ttys010,则设置tty=ttys010

由于子 shell 脚本正在 globbing 其文件,因此您可以执行 ls *.flac | nl -ba 并找到当前由 ffmpeg 执行的文件的位置,以估计 shell 脚本将继续运行多长时间。

您可以按control-C 终止上述while 循环。您还可以使用向上和向下箭头键循环浏览命令历史记录以重新启动该循环。

在上述while 循环的任何迭代中,您都应该看到子bash 命令及其任何子命令。如果子ffmpeg 命令当前正在执行,则该命令行上的文件名表示当前正在处理的文件。搜索ls 命令的输出以查看您当前的进度。

【讨论】:

感谢您的快速回复。如上所述制作您的第一个脚本。然后运行了第二个 CLI,但仍然不确定这意味着什么——这对我来说是一个新的水平。 /Volumes/Backup3/httpd/public/local/music/data/Shakatak/View From the City (1998) [用户] ls *.flac | nl -ba 1 01 Nova Bossa.flac 2 02 Drive-in.flac 3 03 Magic.flac 4 04 Sundown.flac 5 05 Get Up.flac 6 06 Driftin'.flac 7 07 再靠近一点.flac 8 08 说什么You Want.flac 9 09 Slammin'.flac 10 10 It's Alright.flac 11 11 Steveland.flac 12 12 Say Somethin'.flac【参考方案2】:

已解决 将转换脚本更改为使用 'flac' 而不是 'ffmpeg' 的脚本。

#!/bin/sh
#
# http://hints.macworld.com/article.php?story=20040323004759816
# flacmp3 - convert a flac file to mp3
#
if [ "$1" ]
then
  for file
  do
    if [ -e "$file" ]
    then
      /usr/local/bin/flac -c -d "$file" | /usr/local/bin/lame -h -m s -b 192 - "$(basename "$file" .flac).mp3"
    else
      echo >&2 "No such file: "$1""
      exit 1
    fi
  done
else
  echo >&2 "Usage: "$(basename "$0")" INPUTFILE [...]"
  exit 1
fi

问题已解决。但我仍在试图确定它之前失败的原因。 非常感谢所有在一个特殊的日子抽出时间花在这件事上的人。

【讨论】:

以上是关于macos shell脚本不返回控制的主要内容,如果未能解决你的问题,请参考以下文章

防止/禁止 macOS 在 shell 脚本运行时关闭

命令在控制台中能正常执行但在shell脚本中却无法执行?

shell 脚本 (macOS):从 plist 字符串中打印转义的 Unicode 字符

如何在 macOS Catalina 的应用程序包中运行 shell 脚本

shell脚本case流程控制和exit命令

[Linux脚本]Shell脚本编程