將此處文件複製並貼上到 Bash 將製表符轉換為點

將此處文件複製並貼上到 Bash 將製表符轉換為點

我使用 Windows 10 家用版(內部版本 16299.248),並使用各種 SSH 用戶端(如 Putty/MobaXterm)透過 SSH 連接到遠端 Ubuntu 16.04 電腦。

我將以下程式碼從我的個人 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

請注意幾乎每行開頭的單一點。

有些東西正在將表格轉換為單一點。

事實

  • 我剛才描述的問題發生在各種類型的 SSH 客戶端。

  • 人們也能夠在 Linux 系統(Debian、Ubuntu)中複製該問題,此外,如果我使用 Windows 10 Linux 子系統(WSL),我就不會出現這些點(無論是來自 Powershell 還是 CMD)。我也不在 Windows 10 中使用任何類型的貼上/剪貼簿管理器。

  • 也沒有證據顯示 GitHub 使用任何非常規製表符。

  • 當我從 Mozilla Firefox 或 Google Chrome 複製時會發生這種情況。

  • 安裝 DigitalOcean Ubuntu Bash 後(用 DigitalOcean 術語建立我的「droplet」後),我沒有對它進行任何更改。

這似乎是 中的一個錯誤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 需要執行的操作來修復發行版映像”),但是對於您的特定用法,有很多解決方法:

  1. 最簡單的修復方法是建立一個非隱藏的$HOME在 Heredoc 開始之前,將檔案放在目錄 ( ) 中。這將導致檔案名稱補全匹配 0 個字元。你可以用 say 來做到這一點touch "$HOME"/myFile

  2. 啟動一個禁用 readline 的 shell 並在那裡做你的事情。bash --noediting

  3. 在定界文檔之前關閉完成:bind 'set disable-completion on'

相關內容