
Ubuntu日本語フォーラム

ログインしていません。
かなり初歩的な質問なのですが
第一の質問
terminal では~/で略せますが
.bashrc内でも
export PATH=${PATH}:~/example/example
と略して書いても大丈夫でしょうか?
第二の質問
export PATH=${PATH}:~/example/example
と
export PATH=${PATH}:~/example/example/
最後の/無しだと違うことになってしまうのでしょうか?
前者はファイルとして後者はディレクトリとして?
そうはなってはいないようですが
オフライン
この質問は、「.bashrc」ファイルを覗かれたら理解できると思います。
シェルはログインのときとかシェルスクリプトを実行するときにも起動します。
実行に必要な環境変数やシェル変数は、シェル起動時に実行されるファイルに記入する必要があります。
通常は何らかの設定がされた状態でインストールされています。
この部分を変更して自分なの環境に持っていくには、その仕組みが理解できてないと不具合に遭遇します。
それも自分で解決できるレベルでないと困難が伴います。
よってbashの設定ファイルである各ユーザー用の~/.bashrcを操作されるならそれなりの力量がいります。
勉強されるなら、こちらを参考にしてください。
http://linuxjf.sourceforge.jp/JFdocs/Fr … -HOWTO.txt
さらに詳しくはこちらかな。
http://www.linux.or.jp/JF
それとも単にシェルスクリプトの勉強をされたいのなら、こちらの参考書がお薦めです。
シェルスクリプト 基本リファレンス 山本丈範 技術評論社
ISBN4-7741-2261-0 C3055 ¥2280E M-code 410321
オフライン
結局のところ、チルダを書いてよいのでしょうか?
最後/の有無の違いはなんなのでしょうか?
私も興味があってこのトピックを購読して回答を期待していました。
~/.profile や /etc/environmentの記述などを見れば、真似事レベルでの理解はできるはずですが、それでは厳密な違いがいつまで経っても分からないんですよね。
.bashrc はログインされた後にユーザーのシェル (bash、ubuntu だと大抵は dash) によって実行されます
ログイン後の実行なので、ユーザーのホーム ディレクトリはすでに確定しています
つまり、シェルの規定の動作通り、~ (チルダ) は普通に展開されます
その他のシェルの持つ機能もシェル スクリプトで使えるものは全て利用できます
GUI ログインで .bashrc がバックグランド起動されるようなときは、当然ですがコンソール入出力は大きく制限を受けます
----
ディレクトリ末尾の / (スラッシュ) は、指し示されたものがディレクトリである限りは無視されます
指し示されたものがファイルのときはエラーになります
オフライン
ry による投稿:
ユーザーのシェル (bash、ubuntu だと大抵は dash) によって
特に変更していない限り、一般のユーザーだと bash、サービスなどのユーザーの一部が dash (表記は sh) でした
そして、dash は .bashrc は明示的に呼び出さない限りは使いません
オフライン
ryさん、まずはご回答ありがとうございます。
つまり、チルダも当然使え、/は無視される、ということですね。
ですが、私の説明不足の為、意図が完全に伝わっていなかったようです。
以下は特定の人ではなく、万人に向けて再度発言します。
まず、チルダのことですが、
例えば~/.profileの記述は、環境変数HOMEを使って書いてあります。
今までチルダで書かれた例を見た覚えがないので、ひょっとしてチルダで書くと結果は同じでも、何かしらの問題があるのでしょうか?
#1のihatovさんの質問の意図と違うかもしれませんが。
次に、末尾の/の事です。
既存の~/.profileや/etc/environmentなどの環境変数PATHの定義は、何故に末尾/無しで記述されているか、という素朴な疑問です。
例えばbash completionでディレクトリが補完されると/が末尾に付きます。ls -F の出力にもディレクトリには/が付きます。
ついたりつかなかったりで全体的にちぐはぐな印象を受けるのです。
何か明確な理由があるのかな、と#1の投稿を見て思ったのです。
私が考えるに(間違っているかもしれませんが)、環境変数PATHに定義する値は、ディレクトリしかありえないので、末尾/を敢えてつけてまでディレクトリを意識する必要が無いという事でしょうか。
逆に、例えばJavaの環境変数CLASSPATHの値はディレクトリもjarファイルもありえるので、ディレクトリ末尾に/をつける人もいますね。
STGSAGWAN による投稿:
まず、チルダのことですが、
例えば~/.profileの記述は、環境変数HOMEを使って書いてあります。
今までチルダで書かれた例を見た覚えがないので、ひょっとしてチルダで書くと結果は同じでも、何かしらの問題があるのでしょうか?
端的には、.profile にチルダで書くと危険です。やってはいけません。
・いわゆる tilde expansion は、「文字列の先頭」にあるときに限って動作します。先頭でなくても動作する可能性はありますが、保証はありません。
・PATH 環境変数はコロンで区切ることもありますし、なんらかの文字列と結合して使われることもあります。
PATH=/usr/hoge:${PATH} として列挙するケースが代表例です。この場合はtilde expansionの動作は保証されません。
また、$PATHを取り込んで動作するプログラムがtilde expansionをサポートしていることは(現実的には動作しますが)保証されていません。
……ということで、interactive 操作以外では、tilde expansionは使わない方が妥当なので、たいていの場合は ${HOME} で記述されているはずです。
次に、末尾の/の事です。
既存の~/.profileや/etc/environmentなどの環境変数PATHの定義は、何故に末尾/無しで記述されているか、という素朴な疑問です。
例えばbash completionでディレクトリが補完されると/が末尾に付きます。ls -F の出力にもディレクトリには/が付きます。
ついたりつかなかったりで全体的にちぐはぐな印象を受けるのです。
何か明確な理由があるのかな、と#1の投稿を見て思ったのです。
私が考えるに(間違っているかもしれませんが)、環境変数PATHに定義する値は、ディレクトリしかありえないので、末尾/を敢えてつけてまでディレクトリを意識する必要が無いという事でしょうか。
逆に、例えばJavaの環境変数CLASSPATHの値はディレクトリもjarファイルもありえるので、ディレクトリ末尾に/をつける人もいますね。
こちらは *自分は* 以下のように理解しています。tilde expansionの方は「伝統的な言い伝えと作法」ですが、こちらは確信がありません。
・「ディレクトリ名」は末尾のスラッシュを含みません。環境変数PATHは、その名とは関係なく「ディレクトリ名」を要求します。
・ls等が末尾にスラッシュを含めるのは、「パス名」としての操作上の利便性のためです。
・が、POSIXに従った実装であれば、すくなくとも二個までのスラッシュの重複は暗黙で単一のスラッシュとして扱われるので実害はありません。
オフライン
hitoさん、ありがとうございました。
あとはihatovさんの再登場待ちですね。
> まず、チルダのことですが、
> 例えば~/.profileの記述は、環境変数HOMEを使って書いてあります。
> 今までチルダで書かれた例を見た覚えがないので、ひょっとしてチルダで書くと結果は同じでも、何かしらの問題があるのでしょうか?
> #1のihatovさんの質問の意図と違うかもしれませんが。
.profile は sh (Bourne Shell) のころから使われてきた file なので、それ以降の拡張
は使わないほうが無難です。 (確か ~ は csh から support されたはず)
> 次に、末尾の/の事です。
> 既存の~/.profileや/etc/environmentなどの環境変数PATHの定義は、何故に末尾/無しで記述されているか、という素朴な疑問です。
> 例えばbash completionでディレクトリが補完されると/が末尾に付きます。ls -F の出力にもディレクトリには/が付きます。
> ついたりつかなかったりで全体的にちぐはぐな印象を受けるのです。
> 何か明確な理由があるのかな、と#1の投稿を見て思ったのです。
普通は / をつけません。 completion の場合は次に file が続く可能性が高く、
/ が付いていても実害がないためにつけていると思われます。また ls -F は
ファイルの種類を示すためにわざわざつけています。それが -F option です。
> また、$PATHを取り込んで動作するプログラムがtilde expansionをサポートしていることは(現実的には動作しますが)保証されていません。
$PATH は設定された時点で ~ は展開されています。ですので $PATH を読む program が
~ を解釈する必要はありません。
オフライン