Linux

GNU parset 不在腳本中工作,但在終端中工作

  • May 13, 2022

我遇到了一個奇怪的問題。我從這個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

引用自:https://unix.stackexchange.com/questions/702270