次のようにコマンドの出力をリダイレクト先にしようとしています。
echo .envrc >> $(git config --global core.excludesfile)
しかし、このエラーが発生します。~/.gitignore_global
の出力はどこにありますかgit config --global core.excludesfile
?
bash: ~/.gitignore_global: No such file or directory
以下を使用して操作できましたeval
。
eval "echo .envrc >> $(git config --global core.excludesfile)"
以前はなぜ動作しませんでしたか?もっと良い方法がありますか?
答え1
問題は、グローバル git 構成に~
コマンド置換の結果として実行されたときにシェルで解釈されないリテラル (チルダ) が含まれることです。グローバルGit設定には、次のものを含めることができます。
[core]
excludesfile = ~/.gitignore_global
最初のコマンドは、単一引用符を使用してシェルがその文字を解釈できないようにする次の構文と同じです~
。
echo .envrc >> '~/.gitignore_global'
使用すると、eval
期待されるコマンドを生成するチルダ拡張を含む文字列引数(この場合は上の行)が(再)解釈されるため、この問題は解決されます。
echo .envrc >> /home/your_user/.gitignore_global
この問題を解決するもう1つの方法は、グローバルgit設定の値がフルパスであることを確認することです。
git config --global core.excludesfile ~/.gitignore_global
この場合、シェルは~
拡張されているため、/home/your_user
グローバル git 構成ファイルの内容は次のようになります。
[core]
excludesfile = /home/your_user/.gitignore_global
答え2
対話型シェルの外では、これらのチルダを使用しないことをお勧めします。 (シェルスクリプトは通常$HOME
環境変数を使用します)。より良いアプローチは、必要に応じて安全に拡張することですが、簡単ではありません。https://stackoverflow.com/questions/3963716/how-to-manually-expand-a-special-variable-ex-tilde-in-bash/29310477#29310477
ワンタイムコマンドでgit config --global core.excludesfile
評価結果が何であるかを知って評価しても安全であれば、解決策は問題ありません。