$HOME
と~
はまったく同じであり、したがって同じ意味で使用できるといつも思っていました。今日、pylibmc、a python memcachedへのバインド、共有サーバーで~
を使用するとエラーが発生しましたが、$HOME
。理由を説明したいと思います。
libmemcachedはpylibmcの要件です。サーバーにルートがないため、ホームディレクトリにlibmemcachedがインストールされています。その結果、pylibmcをインストールするには、インストールスクリプトがlibmemcachedの検索場所を認識していることを確認する必要があります。
python setup.py install --with-libmemcached=~
を実行すると、インストールスクリプトが実行されます
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall\ -Wstrict-prototypes -fPIC -DUSE_ZLIB -I〜/ include\ -I/usr/local/include/python2.7 -c _pylibmcmodule.c\ -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing
libmemcachedが見つからないというエラーが発生します。
--with-libmemcached=$HOME
に変更すると、スクリプトが実行されます
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall\ -Wstrict-prototypes -fPIC -DUSE_ZLIB -I/home/waterbotte/include\ -I/usr/local/include/python2.7 -c _pylibmcmodule.c\ -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing
問題なく。問題は、チルダが解決されないことです。しかし、なぜ?
シェルは~
をユーザーのホームディレクトリに置き換えます(-pdate:または~
の後に/
以外の何かが続く場合は、おそらく他のユーザーのホームディレクトリ)、ただしそれが最初の文字の場合のみ単語。
--with-libmemcached=~
の先頭には~
がないため、シェルはそれをそのままにします。
チルダは シェル展開 の一部です(bash、csh、zshなど)。 $HOME
変数はエクスポート可能で、特定のシェルから独立して使用できます。
~
は、Wordの最初の文字であり、引用符で囲まれていない場合にのみ展開されます
$ echo "~"
~
$ echo foo~
foo~
$ echo ~
/home/guest
$ echo ~/foo
/home/guest/foo
~username
は、HOME
のusername
に展開されます。
$ echo ~root
/root
$ echo ~invaliduser
~invaliduser
ファイル名を引用するには、$HOME
を使用するか、サフィックスを引用する必要があります
$ echo "$HOME/foo bar"
/home/guest/foo bar
$ echo ~/"foo bar"
/home/guest/foo bar
$ echo ~root/"foo bar"
/root/foo bar
"POSIX Tilde Expansion" から以下に注意してください
チルダ展開の結果のパス名は、フィールド分割とパス名展開によって変更されないように、引用符で囲まれたものとして扱われます。
主な違いは次のとおりです。
cd /tmp
ls "$HOME" #works
ls "~" #nope
そのため、シェルはいくつかの状況でのみ〜を展開します。あなたの場合、python script simpleはスクリプト内にあります-余分な値ではありません。
次のスクリプトを実行します。
_#!/bin/bash
Sudo -H -u root bash<<EOF
echo $HOME
echo ~
EOF
_
出力:
_/home/my_current_user
/root
_
_~
_が expanded をターゲットシェル(root
で実行)で取得することがわかります。 _$HOME
_はソースシェルによって substituted を取得します(_my_current_user
_で実行)