シェルスクリプトは、パラメータ区切り文字としてスペースを使用しません。 (この小さなファイルの違いを説明できる人はいますか?)

シェルスクリプトは、パラメータ区切り文字としてスペースを使用しません。 (この小さなファイルの違いを説明できる人はいますか?)

ショートバージョン(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

一度はdhex16進数で差を計算したことがあります。次のようになります。

  • 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 a0UTF-8エンコーディングですか?改行しない空白文字。通常は通常の空白のように見えますが、シェルはそれを空白として認識しません。

一部のキーマップでは、AltGr+Spaceや+などのOption文字がSpace切り捨て防止スペースを生成します。キーマップにAltGrパイプ文字がある場合、または後にパイプ文字がある場合は、代わりに入力が簡単になり、次Optionのエラーが発生した場合は興味深いでしょう。|<nbsp>|<sp>

$ echo foo | grep .
bash:  grep: command not found

(SEはnbspを通常のスペースに縮小するため、ここからコピーして貼り付けてもエラーは発生しません。)

他のツールからパラメータをコピーして貼り付けると、奇妙な形式が表示されることがありますが、これはプログラムによって異なります。

バラよりシェルでnbsp文字を処理するキャラクターを生成しないいくつかの解決策。

関連情報