スペースを含むパスをcpに設定しようとすると、スクリプトは失敗しますが、エコーと貼り付けは正常に実行されますか? [閉鎖]

スペースを含むパスをcpに設定しようとすると、スクリプトは失敗しますが、エコーと貼り付けは正常に実行されますか? [閉鎖]

バックスラッシュでエスケープされたスペースを含むパスのディレクトリを文字列変数に格納されている作業ディレクトリのサブディレクトリにコピーしようとするスクリプトがあります。

スクリプトを実行すると、次の使用方法が表示されますcp

usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

しかし、コマンドをエコーすると、完全に正しいように見えます。その後、エコーされた行をコピーして端末に再貼り付けても正常に実行されます。

rm -rf Payload
mkdir Payload
echo cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app
cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app

Bashでなぜ正しく実行されないのかわかりませんが、手動でコマンドを貼り付けるのは完璧です。また、手動で実行すると正常に動作するため、問題が何であるかさえわかりません(しかし明らかに空白が疑われます)。cp役に立つ場合は、終了コードは64です。

$APP_PROTOTYPEのように見えます.golden_repo/Production\ Releases\ Only/Kiosk/1.0.3/Prototype/Kiosk.app。これは.golden_repoマウントされたsmbfs共有です。

ベストアンサー1

単語分割によって2つの異なる引数が生成されるのを防ぐには、スペースを含むコマンド部分を引用する必要があります。

cp -Rf "$APP_PROTOTYPE/" "Payload/${BUNDLE_NAME}.app"

あなたが欲しいものをする必要があります。引用符内で変数の補間を許可するには、単一引用符の代わりに二重引用符が必要です。

出力は、echoコマンドが正しく動作しなければならないことを意味しません。パス名の処理とは異なり、cp単語echoの分割のために1つのパラメータが複数のパラメータになるのはまったく問題ありません。

echo 'a b'

そして

echo a b

どちらも同じ結果を生成する必要があります。

おすすめ記事