bashスクリプトソース:そのようなファイルまたはディレクトリはありません


9

このように始まるスクリプトがあります

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

しかし、実行すると戻ります line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

しかし、ファイルは存在し、実行するsource ~/myProjects/valkyrie/cluster.confと正常に実行されます。何か案が?VALKYRIE変数を他の場所に設定したので、パスのハードコードはオプションではありません。


これが役立つかどうかは100%わかりませんが、〜にスペースがある場合は、変数を完全に引用してみてください。したがって、source "${VALKYRIE}/cluster.conf"
Sparhawk 2013年

いいえ、それは役に立ちません。
Khoi

1
それは~きちんと拡大しないことと関係があると思います。意図的に偽のパスでスクリプトを実行すると、エラーはとは表示されず~、パスが拡張されます。~スクリプトのを絶対パスに置き換えてみてください。また、スクリプトで次のコマンドを実行してみてくださいecho ~
Sparhawk 2013年

2
$HOME代わりに試すこともでき~ます。
Sparhawk 2013年

3
@コイそれはそれを説明します。~/.pam_environmentはシェルスクリプトではないため、チルダ展開やパラメータ展開など、シェルに期待される一般的なことは行わないため、どちら~$HOME置き換えられません。~/.profile代わりにその行を移動しexport 、前に追加すると、機能するはずです。
ゲイラ2013年

回答:


8

~正しく拡張されていないようです。意図的に偽のパスを使用してスクリプトを実行すると、エラーはとは表示されず~、パスが拡張されます(つまり、で/home/sparhawk/fakepathはありません~/fakepath$HOME代わりに~を使用するか、スクリプトで完全パスを使用してみてください。

~あなたのスクリプトは私にとってうまく機能するので、なぜあなたのシステムで動作しないのか分かりません。)


bashが展開を実行する順序(gnu.org/software/bash/manual/bashref.html#Shell-Expansions)を見ると、変数展開の前にチルド展開が行われていることがわかります。そのため、変数$HOMEよりも優れ~ています
グレン・ジャックマン

@glennjackmanわかりません。なぜ変数と比較して優先順位が重要になるのでしょう~か?
Sparhawk 2013年

1
それは正確に「優先順位」ではなく、単に最初に来るものです。考慮してください。x="~/.bashrc"; ls $x「ls」コマンドの展開順に、bashはチルドを検索し、チルドを見つけません。最終的にbashは変数を参照して展開します。bashが戻ってチルダを再び探すことはありません。この時点では、単なるプレーン文字です。また、現在のディレクトリにチルダで始まるファイルはありません。
グレン・ジャックマン2013年

うん、いいよ。わかったと思います。そのコマンドがなぜ失敗してx=~/".bashrc"; ls $x機能するのか、いつも疑問に思っていました。情報をありがとう。
Sparhawk 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.