![heredocumentをBashにコピー&ペーストするとタブがドットに変換される](https://rvso.com/image/718156/heredocument%E3%82%92Bash%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%EF%BC%86%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B%E3%81%A8%E3%82%BF%E3%83%96%E3%81%8C%E3%83%89%E3%83%83%E3%83%88%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%95%E3%82%8C%E3%82%8B.png)
私は Windows 10 Home (ビルド 16299.248) を使用しており、さまざまな SSH クライアント (Putty/MobaXterm など) を使用してリモートの Ubuntu 16.04 マシンに SSH 接続しています。
個人の GitHub アカウントから次のコードをコピーして SSH セッションに貼り付けます。
cat <<-EOF >> "$HOME"/.bashrc
export s_a="/etc/nginx/sites-available"
export s_e="/etc/nginx/sites-enabled"
export drt="/var/www/html"
source "$HOME"/"$repo"/software_internal.sh
EOF
コピーします私の GitHub アカウントから直接 (非生のバージョン)ただし、GitHub の生のバージョンからコピーした場合でも、次の問題が発生します。
私の問題
リモート Bash の結果は次のようになります。
> .export s_a="/etc/nginx/sites-available"
> .export s_e="/etc/nginx/sites-enabled"
> .export drt="/var/www/html"
> .source "$HOME"/"$repo"/software_internal.sh
> EOF
ほぼすべての行の先頭にある 1 つのドットに注意してください。
何かが表を単一のドットに変換しています。
事実
今説明した問題は、さまざまな種類の SSH クライアントで発生します。
Linux システム (Debian、Ubuntu) でも問題を再現できました。さらに、Windows 10 Subsystem for Linux (WSL) を使用すると、ドットが表示されません (Powershell からでも CMD からでも)。また、Windows 10 では、いかなる種類のペーストボード / クリップボード マネージャーも使用していません。
GitHub が非標準的なタブ文字を使用しているという証拠もありません。
これは、Mozilla Firefox または Google Chrome からコピーするときに発生します。
DigitalOcean Ubuntu Bash をインストールした後 (DigitalOcean の用語で「ドロップレット」を作成した後)、何も変更しませんでした。
これは のバグのようですGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
。Debian stable 9.3 でも Bash 5.2 を使用してこのバグを再現できました。ただし、この問題は Arch では発生しないため、Debian ディストリビューションに固有のものである可能性があります。
さらに詳しい情報
この問題は DigitalOcean だけでなく Linode でも発生します。Linode のエンジニアは、Ubuntu 14.04、16.04、17.04 でこれを再現できました。
DigitalOcean と Linode が Ubuntu を同じようにカスタマイズし、バグが Bash に存在せず、DigitalOcean と Linode に固有のものである可能性があります。
まとめ
上記の問題は、Windows 10、SSH クライアント、GitHub GUI、または Web ブラウザーのいずれかから発生する可能性は極めて低く、Debian リポジトリ、4.3 / 5.2 / その他の Bash、または Debian-Bash の組み合わせから発生する可能性があります。
私の質問
この問題に対処する正しい方法は何でしょうか? もちろん、ヒアドキュメントのタブを削除することもできますが、それは絶対に望ましくありません。タブはヒアドキュメントをより適切に整理するのに役立ちます。
答え1
Bashはヒアドキュメント内でファイル名の補完を行っています。ディレクトリに非表示ではないファイル(「.」で始まらないファイル)なので、最長の部分文字列ディレクトリ内のすべてのファイル名の先頭に一致する文字は '.' であり、これが提供され、入力に残されます。
私が試したすべての場所で、同じバージョンの Bash がこの動作を示しているため、特定の VPS プロバイダーに限定されているわけではないことは明らかです。補完を完全に無効にしないと、この動作を止めることができませんでした (そのため、「ディストリビューション イメージを修正するために Linode が行う必要があること」を提供することはできません)。ただし、特定の使用状況では、回避策がいくつかあります。
Bash自体に何も変更を加えずに最も簡単に修正できるのは、非表示ではないヒアドキュメントが始まる前に、ディレクトリ (
$HOME
) 内のファイルを検索します。これにより、ファイル名の補完で 0 文字が一致するようになります。これは、 のように実行できますtouch "$HOME"/myFile
。readline を無効にしてシェルを起動し、そこで作業を行います。
bash --noediting
ヒアドキュメントの前で補完をオフに切り替えます。
bind 'set disable-completion on'