環境変数を設定するシェルスクリプト


82

変数をエクスポートするシェルスクリプトを書きたいと思います。

以下にスクリプトをリストしました。

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

しかし、これは正しく機能していないようです。代わりに、シェルプロンプトでコマンドを個別に実行する必要があります。


どのシェルを使用していますか(bash、ksh、shなど)
Tom



回答:


48

スクリプトのより多くの部分を示し、個別に実行する必要があり、単純にしたいコマンドを教えてください。

一方、変数を展開するには、一重引用符ではなく二重引用符を使用する必要があります。

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

1つのコマンドの最後にあるセミコロンも不要です。

これまでのところ:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

suあなたがそれを実行することができます:

su -c 'sh /path/to/script.sh'

注:OPは、シェルスクリプトを使用してインタラクティブシェルでエクスポート変数を作成する方法の手順を明示的に要求していませんでした。彼は自分のスクリプトにせいぜい評価するように頼んだだけでした。彼は自分のスクリプトがどのように使用されるかについての詳細については言及しませんでした。インタラクティブシェルを使用する.source、インタラクティブシェルから取得した可能性があります。スタンドアロンのsciptである場合もあればsource、別のスクリプトから取得された場合もあります。環境変数は、インタラクティブシェルに固有のものではありません。この答えは彼の問題を解決しました。


1
こんにちはkonsolebox !! どうもありがとうございました 。しかし、私は違いを理解していませんでした.. PATH = "/ home / linux / Practice / linux-devkit / bin /:$ PATH"を二重引用符で囲んでエクスポートします。&CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-'を一重引用符で囲んでエクスポートします。uによって変更されたスクリプトは正常に機能します。
Prag Rao

@PragRao Paramaterの展開は、一重引用符では発生しません。引用の詳細については、こちらをご覧ください
konsolebox 2013

3
@konsoleboxの質問名は、「環境変数を設定するシェルスクリプト」のように聞こえます。コミュニティの大部分は、現在のシェル(sourceまたは.)からこの種のスクリプトを実行する問題を解決するためだけにこの質問を見つけました。OPの質問に正確に回答していただきありがとうございますが、このトピックはgoogleから見つけました。次の回答は、あなたよりも役に立ちました。有する第二の答えのためのUpvotes(source.私の意見を確認...
avtomaton

@avtomaton繰り返しますが、それはグーグルでそれを見つける他の人々についてではありません。それは質問の元のアプローチについてだけです。質問をどのように変更するか、または回答をどのように提示するかについて懸念がある場合は、メタで議論することを検討してください。
konsolebox 2015

226

スクリプトをsourceまたは省略形で実行する必要があります.

source ./myscript.sh

または

. ./myscript.sh

これは既存のシェル内で実行され、スクリプトによって作成または変更された変数がスクリプトの完了後に使用可能になるようにします。

ファイル名を使用してスクリプトを実行すると、別のサブシェルでスクリプトが実行されます。


2
source ./setenv.shを使用して-:ソースが見つかりませんというエラーを表示します。を使用して。./setenv.shは、setenv.shを開くことができません。これについて私を助けてくれませんか。ありがとう
Vishal 2015年

1
なぜそれらのいまいましいエクスポート変数がそこにない(zsh)試行typeset -gx、エクスポートなどをして、私のwtfを持っていたのか、1時間頭を悩ませていましたか?瞬間とまだ-サブシェルが独自のスコープで実行されることを知りませんでした。差し迫った怒りの管理ミスから私の一日を救ってくれてありがとう
不能2017


0

で解決できませんsource ./myscript.sh。ソースが見つからないというエラーが表示されます。
使用時にも失敗しました. ./myscript.sh。myscript.shを開くことができません。

だから私のオプションは、次のスクリプトで呼び出されるテキストファイルにそれを置きます。

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Tnenは、必要なときにいつでもそれを呼び出します。

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt

1
(exportステートメントを使用して)myscript.shと呼ばれるファイルを生成し、必要に応じてwhileループの代わりにenvironment.shソースを生成するように変更できenvironment.shます。
slajma
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.