ショートバージョン(TL; DR)
2つの小さな1行ファイルがあります。〜らしいまったく同じです:
$ cat f1 f2
./cconv.sh 100 EUR USD
./cconv.sh 100 EUR USD
しかし、そうではありません。サイズには1バイトの違いがあります。
$ ls -l f1 f2
(...) 24 oct. 30 16:19 f1
(...) 23 oct. 30 16:19 f2
$ diff f1 f2
1c1
< ./cconv.sh 100 EUR USD
---
> ./cconv.sh 100 EUR USD
一度はdhex
16進数で差を計算したことがあります。次のようになります。
f1
次に終わるc2 a0 55 53 44 0a
f2
次に終わる20 55 53 44 0a
ここで何が起こっているのか知っている人はいますか?違いは何であり、もっと重要なのはどこから来るのか?ここにリンクがありますdhex
結果のスクリーンショットとともに、両方のファイルを含むzipファイル。
長いバージョン(追加メモを含む)
これら2つのファイルは私のものです~/.bash_history file
。
私は貝殻で非常に奇妙な行動を見つけました。次の非常に基本的なスクリプトを使用してください。
#!/bin/sh
echo $#
echo "$1"
echo "$2"
echo "$3"
exit 0
場合によっては(場合によっては???)、スペースはパラメータ区切り文字として扱われません。
$ ./cconv.sh 100 EUR USD
2
100
EUR USD
しかし、時には期待通りに動作します。
$ ./cconv.sh 100 EUR USD
3
100
EUR
USD
これが私を狂わせている!私は何が起こっているのかを調べるために数時間を費やしました。範囲を絞り込むために試したいくつかのテストは次のとおりです。
- 私はDebian 11、Gnome 3.38を搭載したノートブックを使用しています。しかし、偶然にもまったく同じOS(D11、G3.38)を使用する仮想マシンがあり、すべてが仮想マシンでうまく機能します。明らかに、私がベアメタルノートブックに何かをして、ノートブックが奇妙に動作するようにしたことは間違いありません。しかし、何? ? ?
- 問題はグラフィカルセッションでのみ発生することがわかりました。 ttyを開くと(Ctrl + Alt + FN)、良い結果
- 私の端末エミュレータが疑われます。しかし、動作は他のエミュレータでも同じです(Gnome Terminal、Terminator、およびKonsoleを試しましたが、結果は同じです)
- 私はそれが殻だと思います。しかし、BashやDashでは動作は同じです。
- 私が考えることができるすべてのカスタマイズを無効にしました。
/etc/bashrc
、およびを一時的に削除しました/etc/profile
。/etc/inputrc
/etc/rc.local
- 一時的に削除し
~/.bashrc
ました。~/.profile
~/.inputrc
- すべてのGnome Shell拡張を無効にしました。
- キーボードに問題があるようでUSBキーボードを接続したりしました。同じ結果。
本当に混乱していて何が起こっているのかわかりません。最後に、2つのコマンド間にわずかな違いがあることがわかりました~/.bash_history
。 1つは私のGnomeセッションのコマンド、もう1つは私のttyセッションのコマンドです。明らかに違いがありますが、正確に何であり、考えられる理由は何ですか?
答え1
c2 a0
UTF-8エンコーディングですか?改行しない空白文字。通常は通常の空白のように見えますが、シェルはそれを空白として認識しません。
一部のキーマップでは、AltGr+Spaceや+などのOption文字がSpace切り捨て防止スペースを生成します。キーマップにAltGrパイプ文字がある場合、または後にパイプ文字がある場合は、代わりに入力が簡単になり、次Optionのエラーが発生した場合は興味深いでしょう。|<nbsp>
|<sp>
$ echo foo | grep .
bash: grep: command not found
(SEはnbspを通常のスペースに縮小するため、ここからコピーして貼り付けてもエラーは発生しません。)
他のツールからパラメータをコピーして貼り付けると、奇妙な形式が表示されることがありますが、これはプログラムによって異なります。
バラよりシェルでnbsp文字を処理するキャラクターを生成しないいくつかの解決策。