2016-09-17 10 views
1

これは初めてのことです。最初の例として、.bashrcを私の.bash_profileから入手しようとしています - ~/.bashrcがシンボリックリンクであっても。の.bash_profile

if [ -f ~/.bashrc ] && ! [ -L ~/.bashrc ] 
then 
    # ~/.bashrc is a regular file. Source it! 
    source ~/.bashrc 
    echo "~/.bashrc found." 
elif [ -L ~/.bashrc ] 
then 
    # ~/.bashrc is a symbolic link. 

    # Recursivly follow symbolic links. 
    location="~/.bashrc" 
    while [ -L $location ] 
    do 
    # QUESTION: Control-Flow never reaches this point. 

    # Follow link on macOS. 
    location="$(readlink $path)" 
    done 

    # Check if final target is regular file. Source it! 
    if [ -f $location ] 
    then 
    source $location 
    echo "Symlink to .bashrc found." 
    fi 
else 
    echo "No valid .bashrc found." 
fi 

これは私が私のコードが何を期待するものである:

  • ~/.bashrcがシンボリックリンクが、通常のファイルでない場合:出典それ。
  • ~/.bashrcがシンボリックリンクであればそうでない場合:
    • 限り、対象がシンボリックリンクされ続けるようシンボリックリンクに従ってください。
    • 最終的なターゲットが通常のファイルの場合:ソースはです。
  • その他:をあげてください。

テストとして、元のファイル.dotfiles/.bashrcにシンボリックリンク~/.bashrcを作成しました。私のコードはelifを意図して入力しますが、悲しいことにwhile -loopの本文には入りません(~/.bashrcはシンボリックリンクなので、私は期待しています)。

ここでは何が起こっていますか?私はlocationの変数の割り当ては何とか間違っていると思います。

+0

将来的には、あなたが望むことをしていないコードの特定の部分だけを含めるように質問を分解してみてください。実際の問題とは何の関係もないここにはたくさんのものがあります。 http://stackoverflow.com/help/mcveを参照してください。 (問題がどこにあるのか分からない場合は、最初に何がうまくいかないかを知るために、各コマンドをログに記録して何かを実行するために 'bash -x'を使用すると、それを絞り込むのに役立ちます)。 –

+0

ところで、http://shellcheck.net/であなたのコードを実行し、見つかったものを修正してください - あなたが今までにホームディレクトリを持っていたとしても、不十分な引用のため微妙なバグが残っています。名前には 'IFS'の文字が含まれていました。 –

答えて

2

は交換してください:

location="$(readlink $path)" 

で:

location="$(readlink $location)" 

注:

  1. 変数pathが定義されていませんでした。私はあなたが(Linuxでは、自作などに利用可能)GNU readlinkを持っていた場合、そのオプション-fがループの必要性を排除し使用することができlocation代わり

  2. readlinkを適用することを意図したものと考えています。 1は、シェルが分割、チルダ展開語、および変数の値にパス名展開を適用しようとしない限り、一般的には

  3. は、シェル変数は、二重引用符内で参照する必要があります。

    たとえば、次の行では、のティルド展開が必要です。だから、~/は引用符の外にする必要があります。これが完了すると

    location=~/.bashrc 
    

    locationが参照されているスクリプトの部分は二重引用符で囲む必要があります。一例として:

    location="$(readlink "$location")" 
    

    これは、ファイル名やパス名にスペースが含まれる場合など、非常に重要になります。

+0

私は自家製のもので 'coreutils 'を得ることができると思います。 – Herickson

+1

途中で動作しています。本当にありがとう! – Herickson

+0

場所の割り当てに余分なカッコが必要なのはなぜですか? – Herickson

2

これは、問題が発生します。

location="~/.bashrc" 

チルダ展開が二重引用符で発生しません、それはどちらか

[ -L $location ] 

では発生しません。

ので、割り当てに二重引用符を使用するか、または

location="$HOME/.bashrc" 

または類似を使用しないでください。

関連する問題