〜があるものとないBashの文字列変数の違いは何ですか? [コピー]

〜があるものとないBashの文字列変数の違いは何ですか? [コピー]

私は次のようなドットファイル管理ソフトウェアを使用しています。少し.env。次の内容で名前が付けられた設定ファイルを使用してくださいgit_folder="~/code/Git"

以下のように初めて使用する前に、スクリプトを使用してこのドットファイルツールを設定することもできます。

#!/bin/bash

env1="~/Dropbox/.env"
env2="/mnt/d/Dropbox/.env"

if [ -f $env1 ]; then
    echo "Found dotdrop env file, installing dotfiles..."
    source $env1
    eval $(grep -v "^#" $env1) dotdrop --cfg=${git_folder}/dotfiles/config.yaml install
elif [ -f $env2 ]; then
    echo "Found dotdrop env file, installing dotfiles..."
    source $env2
    eval $(grep -v "^#" $env2) dotdrop --cfg=${git_folder}/dotfiles/config.yaml install
else echo "Pls sync environment files first!"
fi

設定ファイルをに保存すると、~/Dropbox/.envスクリプトの実行時に取得できます"Pls sync environment files first!"(条件付きが必要な場合は実行)。設定ファイルがに保存されていると、/mnt/d/Dropbox/.envスクリプトで予想​​される elif 条件が発生します。

デバッグモードでスクリプトを実行し、違いを得るまで理由を見つけました。

➜  scripts git:(master) ✗ bash -x dotdrop_setup.sh 
+ env1='~/Dropbox/.env'
+ env2=/mnt/d/Dropbox/.env
+ '[' -f '~/Dropbox/.env' ']'
+ '[' -f /mnt/d/Dropbox/.env ']'
+ echo 'Pls sync environment files first!'
Pls sync environment files first!

~だからとの違いが/home/userその理由だと思います。

(roachがユーザー名です)~に変更したときに機能しました。/home/roach

➜  scripts git:(master) ✗ bash -x dotdrop_setup.sh
+ env1=/home/roach/Dropbox/.env
+ env2=/mnt/d/Dropbox/.env
+ '[' -f /home/roach/Dropbox/.env ']'
+ echo 'Found dotdrop env file, installing dotfiles...'
Found dotdrop env file, installing dotfiles...
+ source /home/roach/Dropbox/.env
++ git_folder='~/code/Git'
++ grep -v '^#' /home/roach/Dropbox/.env
+ eval git_folder='~/code/Git'
++ dotdrop '--cfg=~/code/Git/dotfiles/config.yaml' install
     _       _      _
  __| | ___ | |_ __| |_ __ ___  _ __
 / _` |/ _ \| __/ _` | '__/ _ \| '_ |
 \__,_|\___/ \__\__,_|_|  \___/| .__/  v0.22.0
                               |_|


0 dotfile(s) installed.

デバッグの結果、''サラウンドサウンドが+ env1='~/Dropbox/.env'削除されたことがわかりましたが、その理由のようです。

しかし、なぜ


追加の質問、

alias dotdrop="eval $(grep -v "^#" $env1) /usr/bin/dotdrop --cfg=${git_folder}/dotfiles/config.yaml install"などに追加された設定ですbashrczshrcスクリプトに直接追加すると機能しません!

ついに私が追加する必要があることがわかりましたsource $env

だからなぜbashrcファイルで動作しますか?

ベストアンサー1

~これはホームディレクトリへのショートカットですが、文字列の先頭に表示される場合にのみ該当します。外部引用。代入演算子の右側の始まりは文字列の始まりなので、機能env1=~/Dropbox/.envします(またはenv1=~"/Dropbox/.env"さまざまなバリアント)。env1に設定されていますが、現在のディレクトリで単一の文字名を持つディレクトリを見つけるためにファイル名として使用される正確な文字列に設定されます/home/roach/Dropbox/.envenv1="~/Dropbox/.env"env1~/Dropbox/.env~

チルダはワイルドカードではなく略語です。$env1外部引用符は値のワイルドカード文字を拡張しますenv1が、チルダは拡張しません。チルダはワイルドカード文字ではないからです。

を使用することもできますenv1="$HOME/Dropbox/.env"。これはと同じですenv1=~/Dropbox/.env。二重引用符内の文字(ドル)$は特別な意味を持ちます(引用符の外側と同じ)。これは変数置換(またはコマンドまたは算術置換)を開始します。~一方、文字(チルダ)が引用符(または二重引用符)内にある場合、これは単なる一般的な文字です。


エイリアスの場合、bashスクリプトで機能しない理由は、bashがデフォルトでスクリプトからエイリアスを拡張しないためです。エイリアスは各シェルインスタンスの属性であるため、スクリプトにエイリアス定義を含めるかインポートしない限り、どのスクリプトにも効果はありません。これはプロセス環境の一部ではありません。

別名が2番目のスクリプトで機能する理由は、dotdrop自体が設定値を読み取るとチルダを拡張するためです。

おすすめ記事