2016-07-23 9 views
1

Bashスクリプトを作成するときに、私はいつもPATH環境変数を定義する最初の行を持っています。私は最近、これはスクリプトが非常にポータブルになっていないことを発見しました。PATHの変数はLinuxのバージョンによって異なります(私の場合は、スクリプトをArch LinuxからUbuntuに移して、さまざまな実行可能ファイルが同じ場所)。PATH環境変数をcronで起動されたbashスクリプトにインポート

ログインシェルで定義されたPATH環境変数を現在のBashスクリプトにコピーすることはできますか?


EDIT: 私は私の質問は、私はbashスクリプトでログインシェルのPATH環境変数を変更するいくつかの考え方が得られ、いくつかの混乱を引き起こしていることがわかり、何の正反対ですが欲しいです。

これは私が現在、私のbashスクリプトの1つの上部に持っているものです。

#!/bin/bash 
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl 
# Test if an internet connection is present 
wget -O /dev/null google.com 

私はからログインシェルをコピーPATHの値が何かを持つ、第2のラインを交換したいですスクリプト環境:

#!/bin/bash 
PATH=$(command that copies value of PATH from login shell) 
# Test if an internet connection is present 
wget -O /dev/null google.com 

EDIT 2:大変申し訳ございませんが、問題のスクリプトがcronを介してスケジュールで実行されていることに言及するのを忘れました。 Cronは、ログインシェルの環境変数を使用しないスクリプトを実行するための独自の環境を作成します。私はちょうどcronで次のスクリプトを実行しようとしました:

#!/bin/bash 
echo $PATH >> /home/user/output.txt 

結果は次のとおりです。あなたが見ることができるように、クーロンで使用PATH変数は、ログインシェルに異なっている:あなたは特別な理由がない限り、

[email protected]_router:~$ cat output.txt 
/usr/bin:/bin 
[email protected]_router:~$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 
+3

あなたがこれを行うにはしたくない理由は? –

+1

Mac OS Xでは、 '/ etc/profile'には次のものが含まれています:' if [-x/usr/libexec/path_helper]; eval '/ usr/libexec/path_helper -s'を実行します。 fi'。これは 'PATH'と' MANPATH'を設定します。あなたはU&LとSUで 'path_helper'に関する質問を見つけることができます - 言及された速度問題は解決されました(少数 - 10.11.6の8-10ミリ秒のように)。 Linuxの '/ etc/paths.d'を見てください。しかし、疑問が残っています - あなたはなぜPATHを試してみたいのですか?私はコマンドのどのバージョンを使うべきかについて私自身の見解を持っているかもしれません。それは私のPATHの設定です。もちろん、私があなたのスクリプトを壊した場合、それを修正するために私に責任があります。 –

+0

私はあなたの2人が私が要求していたことを誤解しているのではないかと心配しています。私はうまくいけば物事をクリアするために私の質問を編集しました。 – XJDHDR

答えて

0

そう長くした後、私は最終的にこの質問への答えが見つかりました:

PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin:$(grep 'PATH=' /etc/environment | sed 's/^.*=// ; s/\"//g') 

このコマンドはenvironmentファイルからLinuxがPATHに割り当てられた値をつかむとcronで使用PATHに追加します。

私は答えを見つけるために以下のリソースを使用:

grep for contents AFTER pattern

https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables

3

は、ユーザーのPATHまったく手を触れないでください。何もしないことは(基本的に)あなたが求めるものを達成するでしょう。

すべてのプロセスがPATHと他のすべての環境変数を自動的に継承するため、ユーザーの通常のPATHを取得するために何もする必要はありません。

あなたはPATHに非標準何かを追加する必要がある場合は、通常のアプローチは、先頭に追加(または追加)することで、ユーザーの既存のPATHに新しいディレクトリので、のように:cronジョブの

PATH=/opt/your/random/dir:$PATH 

環境があります対話型シェルは一般的に制約の少ない環境でも動作しますが、システムの「デフォルト」(「デフォルト」の定義に近い)にかなり近いものです。しかし、もう一度、そのための修正は、スクリプトの先頭にある現在の値に欠落しているディレクトリを追加することです。この特定のシステムに存在しないディレクトリを追加することは、重複するディレクトリを導入することと同様に無害です。

+0

あなたは私の質問に誤解しています。私は 'PATH'環境変数を変更したくありません。その環境変数の値をスクリプトの環境にコピーしたいと思います。 – XJDHDR

+0

私はあなたを完全に理解していると信じています。何もしなければ、ユーザの 'PATH'を継承することになります。ほとんどの場合、システムのデフォルトの' PATH'と同じになります。もしそうでなければ、その方法を設定した理由はもっともです。とにかく、システム全体のデフォルトが1つである必要はありません。 Linuxで。ユーザーの構成設定を上書きする必要があると感じたら、私が説明しているメカニズムは、あなたが望むようなものではなく、おそらく実行すべきものです。 – tripleee

+0

私は再び自分の質問を編集しました。私は、忘れてしまった非常に重要な情報があることに気付きました。大変申し訳ありません。 – XJDHDR

関連する問題