cygwin的坑坑窪窪

背景介紹

使用中遇到的問題

cygwin使用過程中存在很多問題,例如權限、時區之類的問題。

本文目的

弄清楚cygwin的哪些操作或者特性會跟windows本身的衝突,以便更好的使用cygwin管理Windows Server系統。

環境

操作系統:WindowsServer2012 x64

Cygwin版本: CYGWIN_NT-6.2 TEST 2.0.2(0.287/5/3)2015-05-0817:00 x86_64 Cygwin

Cygwin核心概念

Windows安全概述

Windows NT系統包含了一個基於ACL的複雜的安全模型,cygwin默認情況下在支持它們的文件系統(通常會是NTFS)上將Win32文件的屬主和權限映射爲ACL。擁有Administrator權限的用戶可以修改文件的屬主。

在Windows安全模型中,幾乎所有的object都是安全的。這裏的object指的是文件、進程、線程、信號量等。每一個object都有一個叫做SD(security descriptor)的數據結構,SD包含了所有的權限管理信息。

SD包含下面幾個要素:

  • Flags which control several aspects of this SD. This is not discussed here.

  • object屬主的SID

  • object屬組的SID

  • 一個ACE(Access Control Entries)列表,稱爲DACL(Discretionary Access Control List)

  • 另外一個ACE列表,稱爲SACL(Security Access Control List)

每個ACE都包含一個SID(Security IDentifier)。SID是所有用戶、組、計算機、AD域的唯一標識符。與POSIX中的UID/GID不同的是,SID是跨計算機、域全局唯一的。

例如:一個計算機“foo”的SID爲:

S-1-5-21-165875785-1005667432-441284377

該計算機“foo”中的一個用戶“johndoe”的SID爲:

S-1-5-21-165875785-1005667432-441284377-1023

格式:

  • 第1段恆爲S;第2段爲SID結構的版本號,目前爲1;

  • 第3、4段代表SID的類型或類別,計算機和域永遠以S-1-5-21開始;

  • 接下來的3段是一個32位的值,代表一個計算機系統的96位唯一標識;

  • 用戶的SID是在計算機SID的後面加上一個編號,這個編號稱爲RID(relative identifier),當用戶創建的時候,RID就跟着一起創建出來了。

對域而言,也是類似的結構。 
SID of a domain “bar.local”:

S-1-5-21-186985262-1144665072-740312968

SID of a user “johndoe” in the domain “bar.local”:

S-1-5-21-186985262-1144665072-740312968-1207

注意:雖然上面的johndoe用戶在計算機中存在,又在域中存在,但是他具有不同的SID,因此這兩個SID並不是同一個賬戶。不同的SID,就是不同的賬戶。

從Cygwin 1.7.34版本之後,cygwin就會自動的將Windows中的SID翻譯成POSIX的UID、GID。Windows系統中的RID會被轉換成/etc/passwd、/etc/group中的UID、GID。

ACE包含3個部分:

  • ACE類型:allow ACE或deny ACE

  • 32位的權限位

  • 這些權限允許或拒絕的SID

文件權限

cygwin將Windows系統的文件權限實現成POSIX的文件權限,而POSIX文件是以ACL來管理文件權限的。POSIX的文件、目錄權限是被mount選項來控制的,默認設置爲acl。 
也就是說在默認情況下,/etc/fstab文件內容爲:

none /cygdrive cygdrive binary,posix=0,user 00

這說明cygwin會模擬POSIX文件權限,從而可能會導致Windows系統中應用程序的文件權限產生混亂,爲了解決這個問題,需要添加noacl參數,將/etc/fatab改爲:

none /cygdrive cygdrive binary,user,noacl,posix=000

在D:\(即/cygwin/d)下分別創建3個文件測試一下權限,效果分別如下圖所示: 
150605170455

左圖爲Windows系統中創建的文件的權限,中間爲cygwin在默認情況下模擬POSIX文件權限創建出來的文件權限,右圖爲cygwin添加了noacl參數之後,在cygwin中創建的文件的權限。可以看出,添加noacl參數之後,cygwin將不會模擬POSIX文件權限,在cygwin中創建的文件的權限跟Windows系統的文件權限保持一致。

但是上面的改動僅僅是修改了/cygdrive目錄,也就是windows系統中的所有的磁盤(C:、D:、E:、F:等),而cygwin本身的/並未修改,同樣會存在上述的權限問題,因此需要一併修改,最終完整的/etc/fatab文件內容如下:

none /cygdrive cygdrive binary,user,noacl,posix=000
D:\cygwin64 / ntfs binary,noacl,override00
D:\cygwin64\bin/usr/bin ntfs binary,noacl,override00
D:\cygwin64\lib /usr/lib ntfs binary,noacl,override00

cygserver

cygserver 是爲Cygwin作爲後臺服務運行而設計的,默認安裝Cygwin的時候並沒有啓動它。我們需要打開它,並將它作爲Windows的標準服務來安裝。

在Cygwin中輸入命令:

cygserver-config

按照界面提示進行cygserver的安裝,並同意將其安裝爲服務。

運行該服務:

cygrunsrv --start cygserver

cygrunsrv其實是啓動的Windows標準服務cygserver,這個命令也可以在Cmd下這樣做: net start cygserver,或者也可以按下按鍵 Windows+R ,鍵入 services.msc 回車,找到CYGWI cygwerver服務,並啓動之。

查看cygserver服務的狀態:

cygrunsrv --qurey cygserver

cygserver的配置文件:

/etc/cygserver.conf

cygwin命令行工具

所有cygwin的命令行工具都支持 –help(-h)/–version 參數來獲取幫助和查詢版本。

cygcheck:列出系統信息,檢查已安裝的包,查詢包的數據庫。
cygpath:對windows和unix文件路徑做轉換。例如,對於文件“~/.bashrc”-w轉換爲windows文件路徑“D:\cygwin64\home\yhn1792\.bashrc”,-u轉換爲unix文件路徑“/home/yhn1792/.bashrc”。
dumper:對windows進程進行core dump,便於進行gdb調試。
getconf:將系統配置變量值寫入標準輸出。
getfacl:獲取文件或目錄的ACL。
setfacl:設置文件或目錄的ACL。
kill:給cygwin進程發送信號。
ldd:顯示共享的lib依賴關係。
locale:獲取locale信息。
mkgroup:顯示/etc/group風格的組。
mkpasswd:顯示/etc/passwd風格的用戶。
mount:顯示掛載點,或掛載文件系統。
umount:卸載文件系統。
passwd:修改用戶的密碼或者密碼的屬性。
pldd:顯示一個進程加載的動態共享對象。
ps:顯示cygwin進程的狀態。-W參數可以列出windows系統的進程。
regtool:查看或者修改windows系統的註冊表。
strace:跟蹤系統調用和信號。
tzset:從當前的windows系統時區設置中打印POSIX兼容的時區ID。export TZ=$(tzset)

HOME主目錄

如果某些其他軟件(如msysGit)爲 Windows 設置了 HOME 環境變量,會影響到 Cygwin 中用戶主目錄的設置,甚至會造成在 Cygwin 中不同的命令有不同的用戶主目錄的情況。例如:Cygwin下Git 的用戶主目錄被設置爲 /cygdrive/c/Documents and Settings/jiangxin,而 SSH 客戶端軟件的主目錄被設置爲 /home/jiangxin,這會給用戶造成困惑。

之所以出現這種情況,是因爲 Cygwin 確定用戶主目錄有幾個不同的依據,要按照順序確定主目錄:

  • 首先查看系統的 HOME 環境變量;

  • 其次查看 /etc/passwd 中爲用戶設置的主目錄。

有的軟件遵照這個原則,而有些 Cygwin 應用如 SSH,卻沒有使用 HOME 環境變量而是直接使用 /etc/passwd 中的設置。要想避免在同一個 Cygwin 環境下有兩個不同的用戶主目錄設置,可以採用下面兩種方法。

方法1:修改 Cygwin 啓動的批處理文件(如:C:\cygwin\Cygwin.bat ),在批處理的開頭添加如下的一行代碼,就可以防止其他軟件在 Windows 引入的 HOME 環境變量被帶入到 Cygwin 中。

set HOME=

方法2:如果希望使用 HOME 環境變量指向的主目錄,則可通過手工編輯 /etc/passwd 文件,將其中的用戶主目錄修改成 HOME 環境變量所指向的目錄。

命令行補齊忽略文件名大小寫

Windows 的文件系統忽略文件名的大小寫,在 Cygwin 下最好對命令行補齊進行相關設置,以忽略大小寫,這樣使用起來更方便。 
編輯文件 ~/.inputrc ,在其中添加設置:

set completion-ignore-case on

或者取消已有的相關設置前面的井(#)號註釋符。

修改完畢後,再重新進入 Cygwin,這樣就可以實現命令行補齊對文件名大小寫的忽略。

時區

查看時區命令:

tzset

查看時區環境變量:

echo $TZ

查看系統當前時間(UTC時間):

cygcheck -s | grep -i time

查看當前時間(GMT時間):

date -R

下面,通過一個樣例來演示如何設置時區:

### 查看當前UTC時間
$ cygcheck -s | grep -i time
CurrentSystemTime:FriJun0507:50:252015### 查看當前GMT時間,UTC+8小時
$ date -R
Fri,05Jun201515:50:44+0800### 設置爲洛杉磯時間進行測試(注意:此時僅在當前shell環境生效,如需全局生效請寫入配置文件)
$ export TZ=America/Los_Angeles### UTC時間不變
$ cygcheck -s | grep -i time
CurrentSystemTime:FriJun0508:50:502015### 當前時間變爲洛杉磯當地時間,UTC-7
$ date -R
Fri,05Jun201500:50:56-0700

文件系統

cygwin支持POSIX以及Win32類型的文件路徑格式,使用/或者\來分割文件路徑。cygwin的DLL庫會根據需要將POSIX格式轉換爲native NT格式。

$ df -h
文件系統容量已用可用已用%掛載點
D:/cygwin64/bin   16G661M15G5%/usr/bin
D:/cygwin64/lib   16G661M15G5%/usr/lib
D:/cygwin64       16G  661M   15G    5% /
C:45G18G27G41%/cygdrive/c
D:16G661M15G5%/cygdrive/d
E:3.6G3.6G0100%/cygdrive/e

從cygwin1.7.0版本之後,Windows文件系統的POSIX樣式佈局將會保存在/etc/fatab文件中,這是一個全局文件,每個用戶的文件可以保存在/etc/fstab.d/${USER}。

$ cat /etc/fatab
none /cygdrive cygdrive binary,posix=0,user 00

符號鏈接

cygwin用以下幾種方式創建符號鏈接:

  • 默認以純文本格式創建,指明瞭目標文件的路徑,標記爲DOS SYSTEM屬性,使用UTF-16編碼目標文件的文件名;

  • Windows的快捷方式格式.lnk,有一個特殊的header和DOS READONLY屬性,當CYGWIN環境變量設置爲winsymlinks 或winsymlinks:lnk的時候將會創建這種類型的符號鏈接;

  • Native Windows symlinks:Windows Vista/2008或更新版本,當CYGWIN環境變量設置爲winsymlinks:native or winsymlinks: nativestrict的時候將會創建這種類型的符號鏈接;

  • 在NFS文件系統上,cygwin會創建真正的NFS符號鏈接;

注意:上述的各種符號鏈接能在所有環境下識別和使用,但是如果純文本符號鏈接丟失了DOS SYSTEM屬性、快捷方式格式的符號鏈接丟失了DOS READONLY屬性,那它們將不會被認爲是一個符號鏈接。

硬鏈接

Hard links are fully supported on NTFS and NFS file systems. On FAT and other file systems which don’t support hardlinks, the call returns with an error, just like on other POSIX systems.

inode

On file systems which don’t support unique persistent file IDs (FAT, older Samba shares) the inode number for a file is calculated by hashing its full Win32 path. The inode number generated by the stat call always matches the one returned in d_ino of the dirent structure. It is worth noting that the number produced by this method is not guaranteed to be unique. However, we have not found this to be a significant problem because of the low probability of generating a duplicate inode number.

$ ls -lai /tmp/總用量23281474976710864 drwxrwxrwt+1AdministratorNone06月114:30.281474976710851 drwxr-xr-x+1AdministratorNone06月119:07..844424930152905-rw-r--r--1AdministratorNone776月114:29 awk.1040844424930152887-rw-r--r--1AdministratorNone776月114:29 awk.1668844424930150273-rw-r--r--1AdministratorNone776月114:22 awk.1716

擴展屬性

Cygwin 1.7 and later supports Extended Attributes (EAs) via the linux-specific function calls getxattr, setxattr, list xattr, and removexattr. All EAs on Samba or NTFS are treated as user EAs, so, if the name of an EA is “foo” from the Windows perspective, it’s transformed into “user.foo” within Cygwin. This allows Linux-compatible EA operations and keeps tools like attr, or setfattr happy.

chroot

chroot從cygwin1.1.3開始支持,但是chroot並不是Windows上的概念。 
在cygwin上chroot有很多限制: 
a)chroot不是一個提升權限的命令,所有用戶都可以調用它; 
b)對本地Windows進程而言,chroot環境並不安全。 
所以,在cygwin環境下不建議使用chroot。

文本模式和二進制模式

Windows本地應用創建的文件是可以與cygwin應用共同協作的。例如,Windows本地應用創建的文件,應該是可以被cygwin應用可讀的,反之亦然。

但是在文本文件中,Win32和UNIX是有不同的行結束符的。UNIX文本文件中行結束符是一個換行(Line Feed,LF),而Win32文本文件中是兩個字符:一個回車符(Carriage Return,CR)和一個換行(Line Feed,LF)。

Unix/Binary:如果選擇這一項,Cygwin不會轉換文本文件中的行結束符。這是默認選項,適用於大多數的用戶。選擇該選項意味着,用標準的Windows工具(如Notepad)創建的文件,在用Cygwin環境下編譯的程序(如cat)來查看時,貌似帶有額外的行結束符。

DOS/Text:在這種模式下,Cygwin試圖轉換文件的行結束符,這樣一來,用標準的Windows編輯器創建的文件和程序就好像是在Cygwin下運行的程序,因爲每個行結束符只有一個LF字符。Cygwin不會爲以二進制方式打開的文件執行該轉換。(回想一下,在打開文件時需要傳遞一個標誌,表明文件是文本還是二進制數據。)除非需要在環境中使用開發宿主機上的某些”頑固”的程序,否則不應該選擇該選項。

進程的創建

cygwin的fork系統調用沒有與Win32的API映射的很好,這導致很難正確的實現fork調用。當前,cygwin fork並不是copy-on-write機制。 
在cygwin中,父進程創建子進程的流程:

  • 父進程爲子進程在cygwin進程表上初始化一個空間;

  • 使用Win32的CreateProcess調用創建一個掛起的子進程;

  • 父進程調用setjmp來保存他自己的上下文,並在cygwin共享內存中設置一個指向該上下文的指針;

  • 父進程拷貝自己地址空間的數據到這個掛起的子進程的地址空間,來填充子進程的.data和.bss;

  • 當子進程的地址空間初始化完成之後,子進程開始進入運行狀態,父進程等待互斥量;

  • 子進程發現自己已經被fork出來,然後使用以保存的調轉buffer進行跳轉。然後子進程設置父進程等待的互斥量,並且被另外一個互斥量阻塞;

  • 父進程將堆棧數據拷貝到子進程,之後父進程釋放子進程等待的互斥量,並且從fork調用中返回;

  • 最後,子進程從最後一個互斥量中激活,重新創建從共享區域中傳來的內存映射區域,然後從fork中返回;

總之,當前Windows的實現機制使得cygwin不可能實現一個完美、可靠的fork調用,偶爾的fork失敗也是不可避免的。

國際化

根據POSIX標準,cygwin可以通過設置LC_ALL, LC_CTYPE, and LANG環境變量來改變語言,這三個變量是按順序的。變量的內容依從於POSIX標準。 
格式爲:

language[[_TERRITORY][.charset][@modifier]]
  • “language”是一個ISO 639-1定義的兩位、小寫的語言代碼字符串,如果沒有語言在ISO 639-1中沒有找到,則可以使用ISO 639-3的三位字符串來表示。

  • “TERRITORY”是ISO 3166中定義的兩位大寫國家碼字符串。

  • “charset”爲字符編碼。

例如:

"fr_FR.UTF-8" 
language = french, territory =France, charset = UTF-8

注意:默認的locale是”C.UTF-8”。

Windows系統使用UTF-16對文件名進行編碼,所以cygwin將根據LC_ALL, LC_CTYPE, and LANG變量來決定如何將UTF-16格式的文件名轉換爲cygwin指定的格式。

使用 locale.exe -a 命令查看所有locale列表。

潛在的問題  
1. 一個cygwin進程啓動的時候,Windows的環境變量由UTF-16轉換爲UTF-8,如果環境變量僅僅包含ASCII編碼,那麼就不會有問題。但是如果包含本地字符集,例如GBK,那麼將可能會出現亂碼的情況。 
2. 符號鏈接:符號鏈接包含了目標文件的路徑名,如果該路徑名包含了非ASCII碼,那麼改變了locale之後,則有可能出現亂碼。cygwin1.7以及之後的版本不存在該問題。

使用Native Win32路徑

是可以的,但是不推薦這樣用。

下面路徑會被認爲是native Win32路徑: 
a)以盤符開始的路徑:

    C:\foo
    C:/foo

b)全路徑中至少包含了一個反斜槓:

C:/foo/bar\baz/...

c)UNC路徑使用了反斜槓:

\\server\share\...

文件權限

FAT或FAT32

a)讀權限:在FAT或FAT32文件系統中,文件總是可讀的;
b)寫權限:chmod只能改變文件的寫權限;
c)可執行權限:UNIX系統中文件是否有可執行權限取決於文件是否有x權限位,Windows系統中則是根據文件擴展名是否爲.bat/.com/.exe/文件內容是否以#!開始等來判斷。

NTFS

文件權限通過文件的ACL來確定

NFS

文件權限就是標準的POSIX權限了,從server端通過NFSv3協議傳輸過來。

/etc下面特殊的文件需要確保有PublicRead權限:

/etc/fstab
/etc/fstab.d/$USER
/etc/passwd
/etc/group

非法文件名

Win32應用程序會認爲包含AUX, COM1, LPT1 or PRN的文件名爲非法的,例如:prn.txt or foo.aux等。但是這個限制對cygwin應用程序是無效的,cygwin應用不會認爲它們是非法的。

文件名中的非法字符

在Windows文件系統中,ASCII碼的1-31號字符不能用於文件名中,並且下面的字符在Win32 API中有着特殊的意義:

"*:<>?| \

cygwin將會把上面除了\之外的字符做一個轉換,轉換成UNICODE,範圍是:0xf000 - 0xf0ff。因爲\在文件路徑中可以作爲分隔符,所以不會對其進行轉換。

文件名中包含不常用(國外)字符

Windows文件系統使用UTF-16的Unicode編碼來存儲文件名信息。如果不用UTF-8編碼的話,那麼很有可能會有一個或多個字符無法對應到你的字符集。

建議使用UTF-8字符集。

大小寫敏感的文件名

在Win32系統中,文件名是不區分大小寫的。

.exe擴展名

Windows系統中,Win32可執行文件如果以.exe爲擴展名,那麼在執行命令的時候不需要帶上.exe就可以執行了。但是如果是以.bat/.com爲擴展名的文件則必須要帶上其擴展名纔可以執行。

例如:如果filename.exe存在,而filename不存在,那麼ls filename將會列出filename.exe文件的信息。

如果一個shell腳本myprog和一個程序myprog.exe同時存在一個目錄下,那麼無.exe擴展的shell腳本myprog將會優先執行。即:./myprog將會執行shell腳本而不是myprog.exe,如果不存在myprog腳本,纔會是去執行.exe文件。

@pathname

在bash和cmd中使用@pathname會產生不同的效果,樣例如下:

Example3.2Using@pathname 
bash$ /bin/echo ’Thisis"a         long"           line’> mylist
bash$ /bin/echo @mylist@mylist
bash$ cmd
c:\> c:\cygwin\bin\echo @mylistThisis a         long line

需要注意的要點

cygwin不是一個完整的操作系統,與windows的native特性有很大不同,下面列出一些需要注意的地方:

  1. cygwin僅僅是對windows系統的文件系統做了一下POSIX映射,本身並不提供文件系統的驅動;

  2. 一些windows自帶的命令行工具(例如:find.exe,link.exe,sort.exe等),可能會與cygwin衝突,要確保這些命令使用了絕對路徑(/usr/bin/find),或者在PATH環境變量中要將cygwin的bin目錄放在前面;

  3. windows系統無法識別cygwin的文件路徑格式,所以需要藉助cygpath命令進行轉換,例如:notepad.exe “$(cygpath -aw “Desktop/Phone Numbers.txt”)”;

  4. 一些cygpath的工具,例如:ncftp/lynx/wget等,需要網絡連接,並且cygpath是依賴於windows的網絡連接的,所以如果這些工具出現問題,需要使用windows的工具(ping.exe/telnet/ftp)進行調試;

  5. cygpath和windows的符號鏈接是不一樣的;

  6. 編碼格式;

  7. 用戶、組,文件權限、ACL等安全特性的區別;

問題彙總

cygwin安裝sshd

cygwin安裝成功後,連接 ssh localhost,一直出現錯誤:

cygwin Connection closed by::1

費了很多時間查找,總算解決了,原文如下:

在google上看到cygwin的一個官方mail問答。參考Installing the Cygwin SSH daemon 。問題關鍵就是一個特殊的權限問題,在SYSTEM賬戶下運行的sshd服務需要有改變user id的特權(關於權限的問題,在cygwin的/usr/share/doc/Cygwin/openssh.README 中已經說得很明確了:2003Server has a funny new feature.When starting services under SYSTEM  account, these services have nearly all user rights which SYSTEM holds...exceptfor the "Create a token object" right, which is needed to allow public key authentication :-()。所以事件日誌會有seteuid的錯誤。至於解決方案,就是讓cygwin幫你創建兩個特殊用戶sshd和cyg_server,其中sshd服務在cyg_server用戶下運行,cyg_server有相應的權限(在/usr/share/doc/Cygwin/openssh.README 中也有說明)。

關鍵的就是這兩個用戶都要創建。

解決Cygwin下vi和vim方向鍵和Backspace不好用的問題

默認的vi(vim)沒有配置文件,因此導致了方向鍵出現ABCD,以及Backspace只會移動光標,字符不消失的問題。cygwin自帶vi(vim)配置文件的例子,直接拷貝即可,參考以下命令:

$ cp /usr/share/vim/vim74/vimrc_example.vim  ~/.vimrc
Cygwin 中 “Command not found” 的問題

在 Cygwin 上面編譯一些 Unix 軟件時,比如 ffmpeg, gvim 等,由於 Unix / DOS 系統的差異經常會出現一些莫名奇妙的問題,最近經常碰到的一個問題就是:

line 9: $'\r': command not found

這樣的錯誤,初步判斷可能是因爲 \r\n 的區別引起的,遇到這種情況,可以使用 dos2unix 來修復。 
執行: dos2unix configure configure,之後再運行: ./configure ,就不會再出現上面的錯誤了。

換行符引起的問題

windows中的換行符是\r\n, linux/unix下的換行符是\n。 
其中:

回車符:\r=0x0d(13)return;#回車(carriage return)  換行符:\n=0x0a(10)           newline。#換行(newline)在DOS使用的換行符爲^M$,我們稱爲CR與LF兩個符號。而在Linux中,則僅有LF ($)這個換行符。可以用如下命令完成格式轉換:$dos2unix,$unix2dos。

cgywin命令輸出有中文亂碼

執行一些命令(ipconfig等)如果有中文輸出,則會出現中文亂碼問題。 
需要在Options->Text中將本地語言改爲zh_CN,字符集改爲GBK。

顏色問題

ls顏色:Cygwin默認ls的輸出是沒有顏色的,而Ubuntu等一些主流發行版默認爲終端配置了顏色輸出,由於Cygwin採用的mintty.exe虛擬終端是支持顏色的,因此可以編輯~/.bashrc文件,追加:

[plain] view plaincopy
[-x /usr/bin/dircolors ]&&eval"$(dircolors -b)"alias ls='ls --color=auto'

grep顏色:同樣,grep默認也沒有顏色。編輯~/.bashrc文件,追加:

[plain] view plaincopy
alias grep='grep --color=auto'

vim註釋深藍色問題:vim的默認語法着色中,註釋是深藍色,這在黑色背景下看不清楚。可以將其改成淺藍色,編輯~/.vimrc(沒有則創建),添加:

[plain] view plaincopy
syntax on
hi comment ctermfg=blue

或者將背景色設置爲dark,編輯~/.vimrc文件,添加:

[plain] view plaincopy
syntax on  
set background=dark

Cywin輸入、顯示中文不正常

解決:修改.inputrc,解除以下幾行註釋:

#set meta-flag on #set convert-meta off#set input-meta on#set output-meta on

命令行下面home/end鍵無效

在~/.inputrc中添加如下幾行:

vim ~/.inputrc
"\e[3~":delete-char"\e[1~": beginning-of-line
"\e[4~":end-of-line
"\e[H": beginning-of-line
"\e[F":end-of-line
"\e[7~": beginning-of-line
"\e[8~":end-of-line
"\eOH": beginning-of-line
"\eOF":end-of-line

參考資料

cygwin用戶手冊:https://cygwin.com/cygwin-ug-net.html  
cygwin安裝指南:https://cygwin.com/install.html  
cygwin FAQ:https://cygwin.com/faq.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章