他のBashスクリプトによって生成された引用は、元のスクリプトでは引用として扱われません。

他のBashスクリプトによって生成された引用は、元のスクリプトでは引用として扱われません。

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引用符が多すぎずに正しく受信され、機能します。

関連情報