web-dev-qa-db-ja.com

$ HOMEと '〜'(チルダ)の違いは?

$HOME~はまったく同じであり、したがって同じ意味で使用できるといつも思っていました。今日、pylibmc、a python memcachedへのバインド、共有サーバーで~を使用するとエラーが発生しましたが、$HOME。理由を説明したいと思います。

libmemcachedpylibmcの要件です。サーバーにルートがないため、ホームディレクトリに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 

問題なく。問題は、チルダが解決されないことです。しかし、なぜ?

59
tamakisquare

シェルは~をユーザーのホームディレクトリに置き換えます(-pdate:または~の後に/以外の何かが続く場合は、おそらく他のユーザーのホームディレクトリ)、ただしそれが最初の文字の場合のみ単語。

--with-libmemcached=~の先頭には~がないため、シェルはそれをそのままにします。

32
n.m.

チルダは シェル展開 の一部です(bash、csh、zshなど)。 $HOME変数はエクスポート可能で、特定のシェルから独立して使用できます。

43
Jon Lin

~は、Wordの最初の文字であり、引用符で囲まれていない場合にのみ展開されます

$ echo "~"
~
$ echo foo~
foo~
$ echo ~
/home/guest
$ echo ~/foo
/home/guest/foo

~usernameは、HOMEusernameに展開されます。

$ 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" から以下に注意してください

チルダ展開の結果のパス名は、フィールド分割とパス名展開によって変更されないように、引用符で囲まれたものとして扱われます。

24
go2null

主な違いは次のとおりです。

cd /tmp
ls "$HOME" #works
ls "~" #nope

そのため、シェルはいくつかの状況でのみ〜を展開します。あなたの場合、python script simpleはスクリプト内にあります-余分な値ではありません。

9
jm666

次のスクリプトを実行します。

_#!/bin/bash

Sudo -H -u root bash<<EOF
echo $HOME
echo ~
EOF
_

出力:

_/home/my_current_user
/root
_

_~_が expanded をターゲットシェル(rootで実行)で取得することがわかります。 _$HOME_はソースシェルによって substituted を取得します(_my_current_user_で実行)

1
Rufus