2012-04-05 8 views
19

私はパスを使って作業し、ホームディレクトリをbashのチルダで置き換えようとしていますが、私は必要なだけの外部プログラムでこれをやりたいと考えています。ちょうどbashでそれを行う方法はありますか?私は持っていますbashのホームディレクトリをチルダで置き換える良い方法はありますか?

${PWD/#$HOME/\~} 

しかし、それは正しくないです。 \w value in the promptを変換する際に、bashのソースはそれをしない方法をHERES、

/home/alice to ~ 
/home/alice/ to ~/ 
/home/alice/herp to ~/herp 
/home/alicederp to /home/alicederp 

関心の注意点としては:それは変換する必要が

/* Return a pretty pathname. If the first part of the pathname is 
    the same as $HOME, then replace that with `~'. */ 
char * 
polite_directory_format (name) 
    char *name; 
{ 
    char *home; 
    int l; 

    home = get_string_value ("HOME"); 
    l = home ? strlen (home) : 0; 
    if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/')) 
    { 
     strncpy (tdir + 1, name + l, sizeof(tdir) - 2); 
     tdir[0] = '~'; 
     tdir[sizeof(tdir) - 1] = '\0'; 
     return (tdir); 
    } 
    else 
    return (name); 
} 
+0

これは、より多くのCのコードのように、bashのではありません。しかし、文字列をほとんどコンテキストなしで置き換えると、エラーが発生しやすくなります。あなたは確かにそのように進めたいですか? – pizza

+1

申し訳ありませんが、これがはっきりしない場合。 Cコードは、それを行う方法の例です。それはどのようにbash自体がそれを行います。 bashはCで書かれたプログラムです。今、私はbash言語で同じことをしたいと思います。 – Jake

+1

今のところ出力されていることを教えていただけますか? – birryree

答えて

7

this unix.stackexchange answerを参照してください:

あなたbashを使っている場合は、dirs組み込みが必要な 振る舞いがあります。

を ​​

おそらく、そこに貼り付けたBash自身のCコードを使用しています。ここ:)

そして、あなたがそれを使用することができます方法は次のとおりです。

dir=...      # <- Use your own here. 
pushd "$dir" > /dev/null # Switch to the given directory; 
          # suppress output. 
dir_with_tilde=$(dirs +0) # Run "dirs" and save to variable. 
popd > /dev/null   # Switch back to where we were 
+1

ディレクトリスタック( 'pushd foo')を使うときは、元のディレクトリ(スタックの一番下にあるディレクトリ)を表示します。' mypath = "Users/fotssss" )ではなく現在のものです。 – dcoles

+0

ありがとうございます。修正されました。次回は、直接訂正をしてください。 –

+0

あなたは 'dir_with_tilde =" $(cd "$ {dir}" && dirs +0) "を1行として使うことができます... ディレクトリが存在しない場合、存在しないディレクトリに変更することはできません。作成するパスを構築して、フレンドリーな方法でログに記録したい場合があります。 –

12

私のように直接それを行う方法を知りません変数置換の一部が、あなたがコマンドとしてそれを行うことができます:それはむしろ「〜/」と「/ホーム/アリス/」を置き換えます。これはあなたが求めて正確に何をしないこと

[[ "$name" =~ ^"$HOME"(/|$) ]] && name="~${name#$HOME}" 

注意"〜"より。末尾のスラッシュが重要な場所があるため(例:cp -R ~ /backupscp -R ~/ /backupsと異なる場合)、これは意図的なものです。

+3

このソリューションは私のためには機能しませんでした。例えば。/home/alice/documentsは単に "〜"に変更されましたが、ホームディレクトリ部分を置き換えて "〜/ documents"を返すだけでした。明らかに、これは元のポスターの問題ではありませんでした。しかし、私は 'name = $(echo $ name | sed" s:^ $ HOME:〜: ")'を考え出しました。ちょうど解決のために私がここに来て以来、私は共有すると思った。 – Steinar

+1

@Steinar:あなたが望むことをしなければなりません。 '$ {name#$ HOME}'の部分は '$ name'を取り、前面から' $ HOME'を削除します。あなたはそれにタイプミスがあった可能性はありますか? –

+0

@GordonDavisson:あなたの権利、それは私がそれを望んでいたように働いています...私はそれをチェックアウトする際にはタイプミスがあったに違いありません。 – Steinar

6

私は、これは昔ながらのbashの文字列置換で行われました:)

> echo $HOME 
/Users/fots 
> mypath="/Users/fots/some/cool/path" 
> echo ${mypath/$HOME/\~} 
~/some/cool/path 
+2

'mypath ="/Users/Users/fots "'あなたのコマンドの置換が '/ Users〜'につながるのは、パスの先頭には固定されていませんが、文字列のどこに置き換えられます。 –

関連する問題