2012-03-28 14 views
0

は、ここに私の問題のあるコードの例です:bashスクリプトエラー(実際に私が間違っているのか分からない)

#!/bin/bash 
fileList='fileList.txt' 
#IFS=$'\n' 
while read filename 
do 
    echo listing "$filename" 
    ls -ligG "$filename" 
done < "$fileList" 
echo "done." 
#unset IFS 
exit 0 

出力は次のとおりです。

listing /some/long/path/README.TXT 
ls: cannot access /some/long/pa 
: No such file or directoryDME.TXT 

ていることに注意してくださいlsがパスを切断します。パス/ファイル名の末尾がエラーメッセージに追加されていることにも注意してください(「No such file or directory」の後ろ)。

私はまさにこの長いパスでそれをテストし、それはまだエラーを与える:

/this/is/an/example/of/shorter/name.txt

誰もが何が起こっているのか知っていますか?私はすでに時間このいじりてきた: - 応答で/

はの答えをtorekし、ここでは詳細は次のとおりです。

まず、ここで変更したスクリプトはtorekの提案に基づいています:

#!/bin/bash 
fileList=/settings/Scripts/fileList.txt 
while IFS=$'\n' read -r filename 
do 
    printf 'listing %q\n' "$filename" 
    ls -ligG $filename 
done < "$fileList" 
echo "done." 
exit 0 

その出力は次のとおりです。

# ./test.sh 
listing $'/example/pathname/myfile.txt\r' 
: No such file or directorypathname/myfile.txt 
done. 

気づいていることがまだあります。

ここにファイルがあります。それは存在する。エラーメッセージは、(「パス」に「A」の後には改行)ls: cannot access /some/long/path/README.TXT: No such file or directoryを読むべきではない:改行が手掛かりである

ls -ligG /example/pathname/myfile.txt 
106828 -rwxrwx--- 1 34 Mar 28 00:55 /example/pathname/myfile.txt 
+0

ファイルのアクセス権を確認してください。このようなものはおそらくあなたのターミナルが誤って長いパスを表示しているだけで、 'ls'はまだ適切な名前を得ている可能性が高いです。 – Cfreak

+0

haha​​ - ファイルのアクセス許可を確認しますか?それはまさに私のスクリプトがやっていないことです。 'ls'が適切な名前を得ていれば、上記のエラーは出ません。しかし、私は単純なスクリプトの外でターミナルでコマンドを実行することができ、正しく実行すると言います。しかし、スクリプトは失敗します。 – MountainX

+0

私は、 '-rwxrwx ---'というアクセス権を持つファイルでエラーを生成しましたが、私はrootとしてスクリプトを実行しています。 – MountainX

答えて

2

異常な動作に基づいて、私は、ファイルがCRLF行ターミネータを持っていると言うつもりです。あなたのファイル名には実際には名前の後ろには見えない復帰記号が付いています。 echoでは、最初の列にジャンプしてから改行を出力するだけなので、これは表示されません。ただし、lsは、隠しキャリッジリターンを含むファイルにアクセスしようとし、そのエラーメッセージで、キャリッジリターンエラーメッセージがパスを部分的に上書きします。

離れてこれらの文字をトリミングするには、あなたはtr使用することができます。

tr -d '\r' <fileList.txt> fileListTrimmed.txt 

を、代わりにそのファイルを使用してみてください。

+0

ここに私がしたことがあります: 'rm fileList.txt; nano filelist.txt'単一のファイル名を挿入して保存します。私のスクリプトを実行してください。それは今働く。面白いのは、私がKWriteでfileListを編集していて、何度もリストを吹き飛ばしていたことです。しかし、KWriteはファイルに非常に奇妙なことをしていました。私は何がわからない。 KWriteはUNIXラインターミネータを使用するように設定されています。私は今すぐ確認した。だから、CRLFの行ターミネータではありませんでしたが、それは何らかの形で悪いファイルでした。ありがとう。 – MountainX

+0

これは回線終端装置の問題でした。 Libre Office Calcはそれらをファイル名に貼り付けていて、テキストファイルをKWriteで保存したときには永続化していました。 – MountainX

2

。不思議な切り詰めが起こっても、コロンは「パス」の「a」の直後に起こるはずです。それはそうではありません。文字列はそうではないようです。

試してみてください。

printf 'listing %q\n' "$filename" 

lsを呼び出す前に、ファイル名を印刷します。 Bashの組み込みのprintfには、面白い文字を引用する%qという形式があります。

コメントアウトされたIFS設定の意図がわかりません。恐らくreadが空白で分割されないようにしたいのですか?あなたがreadの前にIFS=を置くことができ、そしてあなたにもread -rを使用することがあります:

while IFS=$'\n' read -r filename; do ...; done < "$fileList" 
+0

私はあなたの提案を実装し、より多くのテストを実行しました。私はその新しい情報を含めるために私の質問を編集しました。 – MountainX

+0

ええと、出力には(@FatalErrorが示唆するように)ファイル名の末尾に改行があることが示されています。 trを使用してそれらを削除するか、IFSがキャリッジリターンを食べるように設定することができます: 'IFS = $ '\ n \ r''。 – torek

+0

ありがとうございます。あなたの答えとFatalErrorはともに役に立ちました。私は受け入れられた答えとして両方を選ぶことを願っています。 – MountainX

関連する問題