シェルスクリプトの外部で宣言された関数を実行する


1

現在、私のZSHにはいくつかのソース関数があります。例えば:

% declare -f
     ... a lot of shell functions appears here.

現在、そのリストから特定の関数を呼び出すシェルスクリプトを書いています(prompt_dirOh-My-ZshのPowerlevel9kのテーマから)。

私のスクリプトは次のとおりです。

#!/bin/zsh
echo_prompt_segment(){
    # bunch of source-code here
}

zsh_oddeven_dir(){
   prompt_dir echo
}

zsh_oddeven_dir

問題は、私のスクリプトがこれらの機能にアクセスできないことです。

% ./oddeven-pwd.sh
zsh_oddeven_dir:1: command not found: prompt_dir

declare -fスクリプト内から行うと、スクリプト内には次の2つの関数しかありません。

% ./oddeven-pwd.sh 
echo_prompt_segment () {

}
zsh_oddeven_dir () {
    declare -f
}

スクリプトの上で宣言された関数にアクセスして実行できますか?もしそうなら、どのように?


質問の本文に解決策を追加しないでください。回答フィールドで自分の質問答えることができます。ソリューションのテキストはここで引き続き利用できるため、再入力する必要はありません。また、タイトルに「解決済み」を追加することは、スーパーユーザーで行うことではありません。問題が解決したことを示すには、回答を受け入れるだけで十分です。
カミルマシオロウスキ

回答:


1

デフォルトではスクリプトはサブシェルで実行されるため、必要な機能はエクスポートされた関数であり、bashでは利用可能ですが、では利用できませんzsh

ではbash、ユーザ機能を追加するための標準的な場所である~/.bashrcが、これはしない限り、実行されていないbash克服する機能をエクスポートし、(スクリプトを実行している具体的には、いないサブシェルで)対話型です。

この答えによると、機能しているように見えるのは、関数宣言をに入れる~/.zshenvことです。

また、以前の(受け入れられた)回答もご覧ください。これは、とりわけ、zshエクスポートされた関数をサポートしない理由を説明しています。


さて、以前に受け入れられた答えは、実際の問題を実際に見ることによって私に指示しました:bashまたはzsh(実際に私のスクリプトと関数宣言のいずれかがあったzsh)とは無関係に、スクリプトを実行すると、別のシェルプロセスで実行されるため、関数参照が失われます。source myscript.sh通常実行する代わりに使用して問題を解決しました。
ディエゴS.

申し訳ありませんが、スクリプトはデフォルトでサブシェルで実行されることを指摘しておくべきでした。私は、誰もがそれを知っているわけではないことを忘れるという考えにとても慣れています。これを説明するために答えを拡大しました。シェルがどのように初期化されるかについてのいくつかの顕著な点で
AFH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.