2016-07-05 4 views
2

私はbashread組み込みを使って一度に1文字ずつ読むことを試みています。これは実際には引数をreadに使用すると完璧に機能しますが、OSXユーザーの中にはbashにそのオプションがないという報告がありました。bashは謎を読む: `read -d '-s -n 1はハイフンを食べる

だから今、私はの線に沿って何か使用しています:このエコーの背中時間除くfilename 1内のすべての文字、不思議な、ハイフン(-)を

$ while IFS= read -r -d'' -s -n 1 char; do echo -n "${char}"; done < filename 

を。例えば。私は

$ cat blah 
uh-oh 

を持っている場合、結果は次のとおりです。ドキュメントの

$ while IFS= read -r -d'' -s -n 1 char; do echo -n "${char}"; done < blah 
uhoh 

何もこのことを示すだろう何も言いません。 echo${char}${#char}に置き換えると、0がハイフンを読み取るはずです。それはちょうど完全に食べられます。

私は-d''をドロップする場合は、代わりに改行を食べるが、改行はデフォルトの区切り文字であるため、少なくとも理にかなっているように、は、ハイフンを食べていません。 -d''がハイフンを区切り文字として扱っているようなものです。

FWIW私は

$ bash --version 
GNU bash, version 4.3.42(4)-release (x86_64-unknown-cygwin) 

を持っているが、これは最初のOSXのユーザーが私に報告されました。

+1

へのセットは '代わりに(非標準)'エコー-n "$炭" 'のprintfの%sは "$の文字を"'使用区切り文字... – anishsane

+0

は 'printfのを使用しています'echo -n'よりも移植性がありますか? – Iguananaut

+0

はい。 POSIX 'echo'は' -n'の標準を指定していません。 – anishsane

答えて

4

実際には、デリミタのオプションを正しく設定していませんでした。

お知らせ余分なスペース:

while IFS= read -r -d '' -s -n 1 char; do echo -n "${char}"; done < filename 

これが正常に動作します。あなたのコードで -s

+0

驚くほど微妙。ありがとうございました! (スペースの不足は、デリミタそのものが区切り文字の前にスペースを必要としない 'cut'から習慣の力であったと思う)。 – Iguananaut

+0

さらに困惑しているのは、 '-s'もまだ正しく処理されているということです。 – Iguananaut

+0

実際に '-s'は処理されません。このオプションは、 'stdin'が端末の場合にのみ意味があります。あなたはリダイレクトを使用していたので、入力はエコーされません。 –

関連する問題