2016-05-30 4 views
2

に、私は(コマンドを実行せずに)その内容とsource *.shを置き換えることができますどのようには、script.shではbashの

source a.sh 
source b.sh 

CMD1 
CMD2 
CMD3 

をその内容と「ソースファイルの交換」、および変数を拡大しますか? 私は、ファイルのソースとすべての変数を展開した後にbashインタープリタが実行するものを見たいと思います。

私はset -n -vを使用するか、bash -n -v script.sh 2>output.shを実行できますが、ソースコマンドを置き換えることはできません(さらに、a.shまたはb.shに変数が含まれている場合は少なくなります)。

私はサブシェルを使用すると考えましたが、それでもソース行は展開されません。ソース行の前後にset +n +vset -n -vの組み合わせを試しましたが、それでも動作しません。

私はその出力をsshを使用してリモートマシンに送信します。 <<output.shを使ってコンテンツをsshコマンドにパイプすることができますが、リモートマシンにrootとしてログオンできませんが、私はsudoerです。 はしたがって、私は解決策があります base64 script | ssh remotehost 'base64 -d | sudo bash'

that clever trickを使用して)私は、スクリプトを作成して、base64でエンコードされた文字列として送信することができると思いましたか? それとも良いアイデアはありますか?

答えて

2

あなたはこのような何か行うことができます。

inline.sh:

#!/usr/bin/env bash 
while read line; do 
    if [[ "$line" =~ (\.|source)\s+.+ ]]; then 
     file="$(echo $line | cut -d' ' -f2)" 
     echo "$(cat $file)" 
    else 
     echo "$line" 
    fi 
done < "$1" 

注これはsource d個のファイルが存在すると仮定して、エラーを処理しませんが。また、可能なハッシュバングを処理する必要があります。 sourcedファイルにsourceが含まれている場合は、スクリプトを再帰的に適用する必要があります。何か(テストしていない)のような:

while egrep -q '^(source|\.)' main.sh; do 
    bash inline.sh main.sh > main.sh 
done 

のは、それをテストしてみましょう

main.sh:

source a.sh 
. b.sh 

echo cc 
echo "$var_a $var_b" 

a.sh:

echo aa 
var_a="stack" 

b.sh:

echo bb 
var_b="overflow" 

結果:ときにだけ実行されるものをbashのを見たい場合は

bash inline.sh main.sh 

echo aa 
var_a="stack" 
echo bb 
var_b="overflow" 

echo cc 
echo "$var_a $var_b" 

bash inline.sh main.sh | bash 

aa 
bb 
cc 
stack overflow 

ところで、あなたは

bash -x [script] 

またはリモート

ssh [email protected] -t "bash -x [script]" 
+0

を実行することができますが、あなたは、あなたのソリューションを試してみました。 shは変数を定義し、main.shは 'echo cc'の後にそれを呼び出します。 変数が拡張されるとは思わない。 はい、私はすでに-xについて知っています。 スクリプトは私のものではなく、リモートマシン上で実行されることを意図していますが、プログラムで書くことができます(変数とある種のインクルード) –

+0

答えを更新しました。値を展開する必要はありません。ソースファイルに 'source'が含まれていない限り、定義をインライン化するだけで済みます。この場合、リモートとローカルの違いは何ですか?例えば。 'ssh user @ host -t" bash -x -c 'echo hi' "' – dimid

関連する問題