バックスラッシュでエスケープされたスペースを含むパスのディレクトリを文字列変数に格納されている作業ディレクトリのサブディレクトリにコピーしようとするスクリプトがあります。
スクリプトを実行すると、次の使用方法が表示されます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
どちらも同じ結果を生成する必要があります。