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

答え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評価結果が何であるかを知って評価しても安全であれば、解決策は問題ありません。

関連情報