Bashを使用すると、私のpwd
ディレクトリにスペースがあるディレクトリが含まれます。
$ pwd
/a/b c/d
これは働きます:
$ ls "$PWD"
bar foo
# yay!
そのコードをスクリプトに入れるとうまくいきます。これで、このコマンドを2つの部分に分割すると、次のようになります。
$ cat foo
echo \"$PWD\"
$ cat bar
ls $(./foo)
foo
参照へのパスを生成します。
$ ./foo
"a/b c/d"
# ok
しかし、bar
引用符は私が期待どおりに処理されません。
$ ./bar
ls: "/a/b: No such file or directory
ls: c/d": No such file or directory
# boo!
これは学術的ではありません。実際に分割したいコマンドはひどいです。単一のスクリプトに入れるのではなく、2つのスクリプトに分割したいと思います。 1つは正しく引用された引数を生成し、もう1つはそれを大幅に単純化します(そして最初のスクリプトを呼び出します)。このひどいパラメータのリストは複数のコマンドに役立つので、別のスクリプトに入れるもう1つの理由です。
アップデート1:btw、これはうまくいきます:
$ cat foo
ARGS="$PWD"
$ cat bar
source ./foo
ls "$ARGS"
$ ./bar
bar foo
しかし、パラメータを変数に入れることは人為的なようです。
アップデート2:@user454038の解決策は、ディレクトリ名の単一のスペースに対して機能しますが、2つのスペースで中断されます。
アップデート3:@mikeservと@user454038はこれを行うのに十分なトレーニングをしました(ディレクトリ名に1つと2つ、そしておそらくいくつかのスペースがあるかもしれません)。
$ cat foo
echo "$PWD"
$ cat bar
ls "$(./foo)"
始めましょう!みんなありがとうございます!
答え1
@mikeservが指摘したように、問題は引用符です。重複した引用。解決策は、foo
もともと引用文に引用文を含めないことです。
dir構造(このディレクトリにcdする必要がありますd
):
~
└── a
└── b c
└── d
dirにd
私たちはそれをあなたfoo
と投稿しました。bar
ただし、次のように生成します。
foo2
:
echo $PWD
bar2
:
set -x
ls "$(./foo2)"
- 私たちは
set -x
何が起こっているのかを明確に見るためにそれを持っています
コマンドプロンプトで実行すると、/bar
次のように表示されます。
$ ./bar2
+++ ./foo2
++ ls '/home/youruser/a/b c/d'
bar bar2 foo foo2
set -x
コードからこれを削除すると、目的の出力を正常に取得できます。
bar bar2 foo foo2
説明する
set -x
ソースに追加してbar
実行すると、次のように表示されます。
$ ./bar
+++ ./foo
++ ls '"/home/youruser/a/b c/d"'
ls: cannot access "/home/youruser/a/b c/d": No such file or directory
これは、コマンドプロンプトで実行するのと同じ効果があります。
$ ls '"/home/youruser/a/b c/d"'
ls: cannot access "/home/youruser/a/b c/d": No such file or directory
- 犯人は余分な
"
引用です - これはオリジナル記事で紹介されました。
foo
- 一度
"
削除するとls
動作します
したがって、元の引用符を削除するとfoo
(私たちが行ったようにfoo2
)、ls
引用符が多すぎずに正しく受信され、機能します。