I/O リダイレクト対象としてのコマンドの置き換え

I/O リダイレクト対象としてのコマンドの置き換え

次のようにコマンドの出力をリダイレクト先にしようとしています。

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

おすすめ記事