奇妙な問題が発生しました。この例を実行しています。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
より長いバージョン:最初のものは2つあります。シェルスクリプトこの機能バージョンを有効にする方法を教えてください。これがこのスクリプトの完全な目的です。設定手順関数定義を最初にロードせずにファセットを実行したい場合(そして関数が定義されている場合はスクリプトよりも優先されるので、実行するとスクリプトの代わりparset
に関数が実行されます)
二つ目はシェル機能実際にこれを実行します(関数である必要があるのはなぜですか?シェルで実行される関数は独自の環境を変更できますが、子プロセスは親環境を変更できないためです。スクリプトでは親プロセスになります。完了できません)。この関数は、その関数が使用されるシェルで定義する必要があります。
関数を定義するには、env_parallel.$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
または、非ログインシェル起動スクリプト(たとえば~/.bashrc
)に追加すると、非parset
ログインシェルで実行されているスクリプトがその機能を使用できるようになります。
man parset
詳細より。