Unix 作业命令未列出后台作业

Unix Jobs command not listing background jobs

我正在尝试创建一个简单的脚本来将文件列表压缩到各自的 zip 文件中。文件很大,所以我尝试使用&符号将文件发送到后台。它的工作原理是我可以看到临时文件已满,并且在一段时间后创建了文件,但是发出 'jobs' 命令不会列出作业。我做错了什么?

#!/bin/ksh

for file in $*;do
    bash -c "zip -q $file.zip $file" &
done

本地 CSH 解决方案

如我之前所说,shell 脚本在 subshell 中执行,而父 shell 将无法列出子shell的职位。为了使用 jobs,作业需要在同一个 shell.

中 运行

这可以通过 source-ing 文件来实现。由于您的默认 shell 是 csh 根据 csh 语法

文件应该包含这些行
# not a script. no need for shebang
# sourcing this file **in csh** will 
# start quiet zip jobs in the background
# for all files in the working dir (*)

foreach file in (*)
   zip -q "$file.zip" "$file" &
end

将此文件保存在易于访问的位置,运行 source /path/to/file 将为您提供所需的内容。

这是在 csh 中执行此操作的唯一方法,原因如下:

  1. 不能是 shell 脚本。 jobs 不可能
  2. csh不支持shell函数
  3. 设置别名不容易,因为 cshforeach 语法

但也要考虑其中的一些备选方案

一个。该组织允许更改登录 shell

  1. 将 shell 更改为允许 shell 函数(例如 bash)
chsh -s `which bash` $USER
  1. 注销并登录或简单地执行 bash(或您选择的 shell)开始新的 shell
  2. 检查你是否正确 shell echo [=24=]
  3. 向您的用户级登录脚本添加一个函数(~/.bashrc for bash)
# executing this command appends a bash function named `zipAll` to ~/.bashrc
# modify according to your choice of shell
cat << 'EOF' >> ~/.bashrc
zipAll() {
    for file in *; do
        zip -q "$file.zip" "$file" &
    done
}
EOF
  1. zipAll 功能应该在下次登录后可用。

乙。该组织不允许更改登录 shell

  1. 只需执行 bash(或您选择的 shell)即可开始新的 shell
  2. 按照步骤 A3 到 A4 进行操作
  3. 当您需要此功能时,暂时切换到带有 bash(或您选择的 shell)的新 shell

C。 B;但您想使用 bash(或其他 shell)

我不知道这是不是一个好的解决方案。希望有人会指出它的不良影响。希望您的组织只允许您更改登录名 shell

  1. 鉴于你的默认 shell 是 csh,在 ~/.cshrc 添加一行以开始 bash(或你的选择shell)
echo 'bash --login' >> ~/.cshrc
  1. 按照步骤 A2 到 A4 进行操作
  2. 将必要的行从现有的 ~/.cshrc 复制到 ~/.bashrc(或对应于你的 shell 的文件)

关于 zip 使用的混淆是我的疏忽。抱歉。
注意:语法 zip -q $file $file.zip 不适用于我的版本。但我保留它假设它适用于 OP 的系统 PS:适用于我的 zip 版本的命令是 zip -q $file.zip file