あなたの問題はscreen
、切り離されたモードでscreen
起動すると、ログインシェルまたはインタラクティブシェルが起動しないため、ソースが取得されないことだと思います(起動時にどのファイルがソースされるかについての説明については.bash_profile
、の「INVOCATION」セクションを参照してください) man bash
. あなたの先頭-
にあることに注意してください
shell -$SHELL
設定は、シェルが常にログイン シェルとして開始されることを意味し、そのため、.bash_profile
ソースされます。
あなたの問題に対するいくつかの可能な解決策:
screen
切り離した状態で起動しないでください。screen
スクリプトがコマンドとして与えられた場合、通常の方法で開始された場合、スクリプトが終了すると終了することに注意してください。たとえば、スクリプトの場合test.sh
:
#!/bin/bash
for n in `seq 1 5`; do
echo $n
sleep 1
done
実行screen ./test.sh
するとスクリプトが実行され、5 秒後に終了します。
.bash_profile
画面で実行しているスクリプトを手動でソースします。すなわち追加
source ~/.bash_profile
スクリプトの先頭に、MyScript
.
更新 1
問題はあなたがロードされていないことだと私はまだ思っているので、あなたが.bash_profile
ロードされていることを確認しましょう。追加してみる.screenrc
screen touch /tmp/when-was-screen-rc-sourced
あなたの最後~/.screenrc
まで
screen MyScript
その後
ls -lt --full-time /tmp
いくつかの異なる方法で画面を起動してみて、~/.screenrc
本当に読み込みに失敗しているかどうかを確認してください。
同様に、行を追加できます
touch /tmp/when-was-bash-profile-sourced
~/.bash_profile
それがいつロードされるかを確認するためにあなたの最後まで。
更新 2
screen
これは、次の行があるときにスクリプトを実行することを示す例です
screen touch /tmp/when-was-screen-rc-sourced
あなたの最後に~/.screenrc
。
テストファイルは次のtest.sh
とおりです。
#!/bin/bash
touch /tmp/when-did-test-sh-start
for n in `seq 1 5`; do
echo $n
sleep 1
done
touch /tmp/when-did-test-sh-finish
これが証拠です。ランニング
$ touch /tmp/when-did-we-start; screen -d -m ./test.sh; sleep 6; ls -ltr --full-time /tmp | tail -n4
出力を与える
-rw------- 1 collins collins 0 2013-11-06 14:43:03.643564802 -0800 when-did-we-start
-rw------- 1 collins collins 0 2013-11-06 14:43:03.659565385 -0800 when-was-screen-rc-sourced
-rw------- 1 collins collins 0 2013-11-06 14:43:03.671565892 -0800 when-did-test-sh-start
-rw------- 1 collins collins 0 2013-11-06 14:43:08.707770194 -0800 when-did-test-sh-finish
したがって、問題はあなた~/.bash_profile
(または不足している環境変数を定義するもの)がロードされていないことに関連していると思います。
アップデート 3
この時点で、達成しようとしていることを正確に理解し、それを行うためのより良い方法を考え出す方が簡単かもしれません. screen ./example.sh
これを行うには、問題を説明する最小限のサンプル スクリプトを提供すると役立ちます (つまり、直接実行するか、画面の起動後に手動で実行すると機能しますが、またはを介して直接実行すると機能しませんscreen -d -m ./example.sh
)。
しかし、それまでの間、別の潜在的な回避策があります (上記の 2 番目の元の提案を試したことがあり
~/.bash_profile
ますか?スクリプトで直接ソースを取得するだけです?):
スクリプトを bash で実行し、明示的に bash をインタラクティブにして、および/またはログイン シェルを作成します。たとえば、インタラクティブなログイン シェルの場合は、次のようにします。
screen -d -m bash -i -I ./MyScript
bash がどのモードでどのファイルをロードするかについては、こちらを参照
してください。によるとman bash
、このbash -i -I
組み合わせにより、bash が対話型ログイン モードでスクリプトを実行するように~/.bash_profile
なるため、ソースを取得する必要があります。