我已经使用Cygwin相当长的一段时间了。现在我想从bash切换到fish。大家都说你应该使用chsh -s /usr/bin/fish
,但出于某种原因,chsh
对我不起作用。试图修改我的Cygwin.bat
文件也不起作用,更改我的/etc/passwd
文件也是如此。
我真的不明白发生了什么。有谁能帮帮我吗?
不要创建 passwd 文件,Cygwin 不建议使用此方法1。可以通过编辑 /etc/nsswitch.conf 来达到相同的效果。添加或编辑以下行:
db_shell: /usr/bin/fish
这种方法的优点是非常简单易懂。缺点是对于有多个用户的系统而言,这些更改会影响到所有用户。唯一需要注意的是,您必须重新启动 Cygwin。
如果在更改之后使用了mkpasswd
,它将为所有允许登录的用户使用您的新默认 shell。
1 mkpasswd
文档中指出:
不要使用此命令生成本地 /etc/passwd 文件,除非您确实需要。有关详细信息,请参阅 Cygwin 用户指南。
我无法在用户指南中找到任何充分的理由,除了提到如果您的用户和组发生更改,则必须重新生成 /etc/passwd 和 /etc/group 文件,我想这是一个足够合理的理由。我可以说,对于新手来说,这个过程有些容易出错。
mintty
,这对我也没有起作用。此外,在我的系统中找不到 /etc/passwd
和 /etc/group
。我使用的是默认的 Cygwin 安装,没有进行任何修改。如果有人能帮忙,那将不胜感激。 - Askerzsh
设置为Cygwin中的默认shell:https://superuser.com/questions/351435/zsh-with-cygwin - Asker我曾经遇到过同样的问题,现在我向您提供我的解决方案。
0- 通过 mintty.exe
打开 cygwin
1- 手动构建密码文件(mkpasswd
)
$mkpasswd > /etc/passwd
2- 更改passwd文件中的默认shell
$vim /etc/passwd
user:*:1976XX:1971XX:U-user\user,S-1-5-21-XXXX:/home/user:/bin/fish
3- 重新启动 mintty.exe
/etc/passwd
在 Linux 中不存在而感到困惑。 - Sridhar Sarnobatcd /d "%~dp0bin" && .\bash --login -i
更改为cd /d "%~dp0bin" && .\zsh --login -i
。 - Aditya Kendre在SuperUser上有一个更简单的答案,只需要在Windows中设置SHELL环境变量为你首选的Shell(例如/bin/tcsh
),新打开的Shell就会使用它。
设置环境变量的步骤如下:
我不确定这是否是一种“正式”的解决方案,但我只是在我的.bashrc
文件底部添加了/usr/bin/zsh; exit
。您可以将/usr/bin/zsh
替换为您选择的shell的路径。到目前为止,它似乎工作得很好。
我想评论被接受的答案,但声望不够。
关于这个方法
$ mkpasswd > /etc/passwd
虽然这可以生成/etc/passwd文件,但是如果你安装cygwin是为了自己使用,而且你的计算机属于一个域,那么mkpasswd可能会运行并尝试消耗整个域用户列表。我曾经因为这种情况拥有一个500MB以上的/etc/passwd文件,直到我删除文件之前,cygwin甚至无法启动。
如果使用mkpasswd路线,我强烈建议使用-c
开关,这样它只会为您自己添加一个条目。
$ mkpasswd -c > /etc/passwd
在共享cygwin服务的机器上(假设您具有写入权限)
$ mkpasswd -c >> /etc/passwd
""c:\cygwin64\bin\fish.exe" --login -i"
(请相应更改路径到您的cygwin文件夹)。这个问题是在2014年写的,当时Cygwin仍然默认创建一个etc/passwd
文件。
在最近的Cygwin版本中,默认不再创建etc/passwd
文件,并且Cygwin建议不使用它(可能是因为Cygwin现在直接从Windows账户数据库读取),而是建议用户编辑/etc/nsswitch.conf
,正如P Daddy在他的回答中所说。
然而,编辑/etc/nsswitch.conf
对我没有帮助,所以我决定终究还是创建了一个etc/passwd
文件,这确实解决了我的问题,让我在Cygwin中设置zsh
作为我的默认shell。
要做到我所做的,只需输入以下命令:
mkpasswd -c | sed -e 'sX/bashX/zshX' | tee -a /etc/passwd
更多详细信息可以在下面的答案中找到,那里是我得到这个命令的地方:
前往 c:\cygwin
或 c:\cygwin64
(根据您的Cygwin主目录)并编辑 cygwin.bat
。将以下内容替换为:
bash --login -i
例如,编写:
rem bash --login -i
tcsh -l
# x2=$(dirs +${cnt} 2>/dev/null)
# [[ $? -ne 0 ]] && return 0
# [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
# if [[ "${x2}" == "${the_new_dir}" ]]; then
# popd -n +$cnt 2>/dev/null 1>/dev/null
# cnt=cnt-1
# fi
# done
#
# return 0
# }
#
# alias cd=cd_func
tcsh
alias g=gvim
source ~/.cshrc
source ~/.aliases