2016-04-12 14 views
0

紛らわしい質問のタイトルにはお詫び申し上げます。私はsudo-ed環境で親スクリプト(shel1.sh)によって起動されたシェルスクリプト(例えばshel2.sh)から対話型のbashシェルを起動しようとしています。 (私はそれゆえ、スーパーユーザーとしてインストールする必要があり、私のソフトウェアのためのガイド展開 スクリプト、sudoを作成していますが、シェルにアクセスするには、ユーザーが必要な場合があります。)sudo-ed環境からbashシェルを起動する

はここ

#!/bin/bash 
set -x 
sudo bash << EOF 
echo $? 
./shel2.sh 
EOF 
echo shel1 done 
shel1.shです

そして、ここでは、私がshel1.shに戻る前に私の入力を待ち、対話型bashシェルを起動するには、この予想

#!/bin/bash 
set -x 
bash --norc --verbose --noprofile -i 
echo $?  
echo done 

shel2.shです。これは私が見るものです:

+ ./shel1.sh 
+ sudo bash 
0 
+ bash --norc --verbose --noprofile -i 
bash-4.3# exit 
+ echo 0 
0 
+ echo done 
done 
+ echo shel1 done 
shel1 done 

bash-4.3#は自動的に終了を呼び出して終了します。興味深いことに、-l(または--login)でbashシェルを起動すると、自動入力はログアウトです!

ここで何が起こっているのか説明できますか?

+1

おそらく端末にアクセスできません。 'bash -i tripleee

+0

「アクセス権がありません」という意味を説明できますか?何とかアクセスを有効にすることはできますか? –

+0

ここでは、(<< EOFのような)ここの文書を使ってstdinをリダイレクトしています。スクリプトの実行方法によっても異なります。 'cron'ジョブは明らかに対話型端末にアクセスできません。 – tripleee

答えて

1

ここでドキュメントを使用するときは、シェルとその生成された子プロセスの標準入力をhereドキュメント入力に結びつけています。

多くの状況でここの文書を使用することは避けることができます。たとえば、ここの文書を一重引用符で囲んだ文字列に置き換えます。詳細なし

#!/bin/bash 
set -x 
sudo bash -c ' 
    # Aside: How is this actually useful? 
    echo $? 
    # Spawned script inherits the stdin of "sudo bash" 
    ./shel2.sh' 
echo shel1 done 

、それはあなたがこれで行きたい場所を正確に確認するのは難しいですが、あなたが一般的に行う必要がないように、最も近代的なLinuxプラットフォームでは、インストールのためのフックのすべての種類を許可するパッケージマネージャを持っていますこの種のもの。それを調べましたか?

+0

あなたのここの文書の例は引用符で囲まれていないので、* calling *シェルは新しいBashインスタンスに渡す前にhereドキュメントの '$? 'の値を展開します。私は間違いだと思う。そうでない場合は、埋め込みスクリプトの周りにsingleの代わりに二重引用符を使用してください。 – tripleee

関連する問題