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
中执行此操作的唯一方法,原因如下:
- 不能是 shell 脚本。
jobs
不可能
csh
不支持shell函数
- 设置别名不容易,因为
csh
的 foreach
语法
但也要考虑其中的一些备选方案
一个。该组织允许更改登录 shell
- 将 shell 更改为允许 shell 函数(例如 bash)
chsh -s `which bash` $USER
- 注销并登录或简单地执行
bash
(或您选择的 shell)开始新的 shell
- 检查你是否正确 shell
echo [=24=]
- 向您的用户级登录脚本添加一个函数(~/.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
zipAll
功能应该在下次登录后可用。
乙。该组织不允许更改登录 shell
- 只需执行
bash
(或您选择的 shell)即可开始新的 shell
- 按照步骤 A3 到 A4 进行操作
- 当您需要此功能时,暂时切换到带有
bash
(或您选择的 shell)的新 shell
C。 B;但您想使用 bash(或其他 shell)
我不知道这是不是一个好的解决方案。希望有人会指出它的不良影响。希望您的组织只允许您更改登录名 shell
- 鉴于你的默认 shell 是
csh
,在 ~/.cshrc 添加一行以开始 bash
(或你的选择shell)
echo 'bash --login' >> ~/.cshrc
- 按照步骤 A2 到 A4 进行操作
- 将必要的行从现有的 ~/.cshrc 复制到 ~/.bashrc(或对应于你的 shell 的文件)
关于 zip 使用的混淆是我的疏忽。抱歉。
注意:语法 zip -q $file $file.zip
不适用于我的版本。但我保留它假设它适用于 OP 的系统
PS:适用于我的 zip
版本的命令是 zip -q $file.zip file
我正在尝试创建一个简单的脚本来将文件列表压缩到各自的 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
中执行此操作的唯一方法,原因如下:
- 不能是 shell 脚本。
jobs
不可能 csh
不支持shell函数- 设置别名不容易,因为
csh
的foreach
语法
但也要考虑其中的一些备选方案
一个。该组织允许更改登录 shell
- 将 shell 更改为允许 shell 函数(例如 bash)
chsh -s `which bash` $USER
- 注销并登录或简单地执行
bash
(或您选择的 shell)开始新的 shell - 检查你是否正确 shell
echo [=24=]
- 向您的用户级登录脚本添加一个函数(~/.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
zipAll
功能应该在下次登录后可用。
乙。该组织不允许更改登录 shell
- 只需执行
bash
(或您选择的 shell)即可开始新的 shell - 按照步骤 A3 到 A4 进行操作
- 当您需要此功能时,暂时切换到带有
bash
(或您选择的 shell)的新 shell
C。 B;但您想使用 bash(或其他 shell)
我不知道这是不是一个好的解决方案。希望有人会指出它的不良影响。希望您的组织只允许您更改登录名 shell
- 鉴于你的默认 shell 是
csh
,在 ~/.cshrc 添加一行以开始bash
(或你的选择shell)
echo 'bash --login' >> ~/.cshrc
- 按照步骤 A2 到 A4 进行操作
- 将必要的行从现有的 ~/.cshrc 复制到 ~/.bashrc(或对应于你的 shell 的文件)
关于 zip 使用的混淆是我的疏忽。抱歉。
注意:语法 zip -q $file $file.zip
不适用于我的版本。但我保留它假设它适用于 OP 的系统
PS:适用于我的 zip
版本的命令是 zip -q $file.zip file