私は実際のxアプリケーションなどで実装し、いくつかのスクリプトをよりエレガントにしようとしています。
スクリプトのある時点で、私たちはデフォルトでマウントされたリムーバブルストレージデバイスのすべてをインポートし、tmp作業フォルダ内の指定されたフォルダにコピーしようとします。シェルで実行するとスムーズに実行されます。コードで実行すると失敗します。
コピーコマンド:
cp -avfr /tmp/mnt221234jk/* /tmp/mnt23255/disk1/
基本アプリケーションで発生するエラーは次のとおりです。
cp: cannot stat: '/tmp/mnt221234jk/*' file not found.
奇妙なことは、それが確かに存在し、アプリケーションを実行しているユーザーに適切な権限があることです。stat /tmp/mnt221234jk/*
シェルから cp コマンドを実行でき、両方とも正常に動作します。
それ以外の/*
ファイルコピーソースから省略すると動作しますが、ターゲットにmnt221234jk
私が望む名前ではない新しいフォルダが作成されます。
いくつかの注意:シェルコマンドを実行するコードは間違いなく機能し、うまく動作します。しかし、作業経路やそのようなものが必要なのは、おそらく少し奇妙です。
ファイルが存在しないために統計的エラーが発生しないと、誰にもビープ音が鳴りますか?
権限などを使用してファイル構造を再帰的に効率的にコピーできる代替シェルコマンドがある場合は、それを別の方法で実装しようとします。
答え1
問題のあるスクリプトの呼び出しは、ワイルドカードファイルではなくシェルによって実行されます。どのように呼ぶかはわかりませんが、ファイルを繰り返すか繰り返す方法を見つける必要があります。
答え2
まあ、あらかじめお詫び申し上げます。実際の問題は実際には非常に簡単です。これはグロービングファイルの問題ですが、シェルが明示的に問題を無効にしたか、相対パスによるものではありません。
「シェルスクリプト」とシェルコマンドを起動しますが、bash / sh / tcshなどのコンテキストの外にあります。 cpを直接実行すると問題が発生するだけです。
実行中
/bin/bash -c "cp /blah/* /someotherdir/"
非常にうまく動作します。ヒントありがとうございます!
答え3
スクリプトにバグがあります。まだスクリプトを表示していないので、どこにいるのかわかりません。
/tmp/mnt221234jk/*
制限された説明を見ると、同じ権限で実行されるコマンドがディレクトリを通過できるとしても、シェルがファイルリストに展開されるようには見えません。したがって、可能な説明は、ワイルドカードをある時点でcp
消したことです。でもう一度開きます。set -f
set -o noglob
set +f