GNU parset 不在脚本中工作,但在终端中工作

GNU parset 不在脚本中工作,但在终端中工作

我遇到了一个奇怪的问题。我正在运行这个例子https://www.gnu.org/software/parallel/parset.html。但它在脚本文件内不起作用。

parset myarray seq 3 ::: 4 5 6
echo "${myarray[1]}"

如果我运行脚本文件,我会收到以下错误

Unknown option: myarray
Unknown option: seq
Unknown option: 3
Unknown option: :::
Unknown option: 4
Unknown option: 5
Unknown option: 6
parset only works if it is a function. The function is defined as part of env_parallel.    
Do the below and restart your shell.

但如果我直接在终端中使用该命令,它就可以工作。我在这里做错了什么

答案1

简而言之:您需要执行错误消息告诉您的操作。

更长的版本:有两种东西叫做parset.第一个是外壳脚本告诉您如何启用该功能版本。这就是该脚本的全部目的,提供设置说明对于那些在没有首先加载函数定义的情况下尝试运行 parset 的人(并且当定义函数时,它优先于脚本,因此 runningparset会运行函数而不是脚本)

第二个是一个外壳函数它实际上完成了工作(为什么它必须是一个函数?因为在 shell 中运行的函数可以修改自己的环境,而子进程不能修改其父进程的环境。如果它是一个脚本,那么它将是一个父 shell 的子进程并且无法完成其工作)。该函数需要在使用它的 shell 中定义。

要定义函数,您需要env_parallel.$SHELL在使用脚本定义的函数之前获取脚本的源码。这可能是在你的 shell 中完成的登录启动脚本(例如~/.bash_profile),但不在非登录启动脚本(例如~/.bashrc)中,这就是为什么它可以从您的终端运行,但不能从脚本运行。

换句话说,如果您的脚本使用 bash 作为解释器运行并且env_parallel.*脚本位于 中/usr/bin/,请在脚本开头附近添加以下内容:

. /usr/bin/env_parallel.bash

重要的:为您运行脚本的解释器获取适当的 env_parallel.SHELL 。例如在我的 debian 系统上,parallel提供以下内容:

$ ls -l /usr/bin/env_parallel*
-rwxr-xr-x 1 root root  4749 Aug 29  2021 /usr/bin/env_parallel
-rwxr-xr-x 1 root root 14565 Aug 29  2021 /usr/bin/env_parallel.ash
-rwxr-xr-x 1 root root 13565 Aug 29  2021 /usr/bin/env_parallel.bash
-rwxr-xr-x 1 root root  5377 Aug 29  2021 /usr/bin/env_parallel.csh
-rwxr-xr-x 1 root root 14554 Aug 29  2021 /usr/bin/env_parallel.dash
-rwxr-xr-x 1 root root  6643 Aug 29  2021 /usr/bin/env_parallel.fish
-rwxr-xr-x 1 root root 12595 Aug 29  2021 /usr/bin/env_parallel.ksh
-rwxr-xr-x 1 root root 12626 Aug 29  2021 /usr/bin/env_parallel.mksh
-rwxr-xr-x 1 root root 14754 Aug 29  2021 /usr/bin/env_parallel.sh
-rwxr-xr-x 1 root root  5380 Aug 29  2021 /usr/bin/env_parallel.tcsh
-rwxr-xr-x 1 root root 12604 Aug 29  2021 /usr/bin/env_parallel.zsh

或者,将其添加到非登录 shell 启动脚本中(例如~/.bashrc),以便parset非登录 shell 运行的脚本可以使用该函数。

man parset详情请参阅。

相关内容