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.
但是,如果我直接在終端中使用該命令,它就可以工作。我在這裡做錯了什麼
簡而言之:您需要執行錯誤消息告訴您的操作。
加長版:有兩個東西叫做
parset
. 第一個是一個shell 腳本,它告訴您如何啟用功能版本。這就是這個腳本的全部目的,為試圖在沒有首先載入函式定義的情況下執行 parset 的人提供設置說明(並且在定義函式時,它優先於腳本,因此執行parset
執行函式而不是腳本)第二個是實際工作的shell函式(為什麼它必須是函式?因為在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
。