在Cygwin中设置默认Shell

32

我已经使用Cygwin相当长的一段时间了。现在我想从bash切换到fish。大家都说你应该使用chsh -s /usr/bin/fish,但出于某种原因,chsh对我不起作用。试图修改我的Cygwin.bat文件也不起作用,更改我的/etc/passwd文件也是如此。

我真的不明白发生了什么。有谁能帮帮我吗?


你是否将 /usr/bin/fish 添加到 /etc/shells 中了? - glenn jackman
我试过了,但是没有成功。 - Alex
10个回答

44

尝试编辑 /etc/nsswitch.conf 而不是 /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 安装,没有进行任何修改。如果有人能帮忙,那将不胜感激。 - Asker
在阅读了David Paktor对以下问题的回答之后,我终于成功将zsh设置为Cygwin中的默认shell:https://superuser.com/questions/351435/zsh-with-cygwin - Asker

19

我曾经遇到过同样的问题,现在我向您提供我的解决方案。

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


非常有帮助!谢谢 - Wojciech Kaczmarek
1
不要因为 /etc/passwd 在 Linux 中不存在而感到困惑。 - Sridhar Sarnobat
当您在Windows终端中使用Cygwin时,此方法无效。要在Windows终端中使用zsh,请编辑Cygwin.bat并将cd /d "%~dp0bin" && .\bash --login -i更改为cd /d "%~dp0bin" && .\zsh --login -i - Aditya Kendre

7

SuperUser上有一个更简单的答案,只需要在Windows中设置SHELL环境变量为你首选的Shell(例如/bin/tcsh),新打开的Shell就会使用它。

设置环境变量的步骤如下:

  1. 进入“系统”控制面板(右键点击“开始”菜单并选择“系统”)
  2. 在左侧列中点击“高级系统设置”
  3. 从弹出的“系统属性”窗口中,点击“环境变量”按钮
  4. 在“用户变量”或“系统变量”框中(取决于您想要更改是否仅影响自己还是所有用户),点击“新建”按钮。
  5. 在“变量名称”框中输入“SHELL”,在“变量值”框中输入到您首选Shell相对于Cygwin文件系统的路径。
  6. 在三个打开的窗口中单击“确定”以保存更改。

1
我发现在运行mintty终端时可以工作,但是通过ssh连接时无法工作。 - Guido Tarsia

5

我不确定这是否是一种“正式”的解决方案,但我只是在我的.bashrc文件底部添加了/usr/bin/zsh; exit。您可以将/usr/bin/zsh替换为您选择的shell的路径。到目前为止,它似乎工作得很好。


我已经在2年前为你的回答投票了。我再次来到这里寻找相同的回答,但无法再次投票。谢谢。 - Ivan

3

我想评论被接受的答案,但声望不够。

关于这个方法

$ mkpasswd > /etc/passwd

虽然这可以生成/etc/passwd文件,但是如果你安装cygwin是为了自己使用,而且你的计算机属于一个域,那么mkpasswd可能会运行并尝试消耗整个域用户列表。我曾经因为这种情况拥有一个500MB以上的/etc/passwd文件,直到我删除文件之前,cygwin甚至无法启动。

如果使用mkpasswd路线,我强烈建议使用-c开关,这样它只会为您自己添加一个条目。

$ mkpasswd -c > /etc/passwd

在共享cygwin服务的机器上(假设您具有写入权限)

$ mkpasswd -c >> /etc/passwd


3
如果您是通过ConEmu运行Cygwin的,则最简单的方法是将命令行替换为运行fish而不是默认shell(设置->启动->任务):""c:\cygwin64\bin\fish.exe" --login -i"(请相应更改路径到您的cygwin文件夹)。

1
我试图在Cygwin中将默认shell更改为zsh,我发现这里的部分答案很有用,但没有一个给出完整的解决方案。我找到的最好的说明在Robby Russel的oh my zsh github repo中的“安装zsh”说明中,您可以在这里找到。
在页面顶部,它有通用的安装zsh指令,然后是许多不同平台的特定指令。您可以向下滚动到Cygwin部分并按照以下步骤操作:
“更改默认shell的最简单方法是设置SHELL用户环境变量。搜索“编辑帐户的环境变量”以打开环境变量窗口,创建一个名为“SHELL”的新变量,并赋予其值“/usr/bin/zsh/”。”
(在Windows 7上: 按Windows键。 开始输入“环境”。 当它出现时,选择“编辑帐户的环境变量”,并像上面所述添加新变量。)
之后,我关闭并重新打开了我的Cygwin shell窗口,并使用echo $SHELL测试了它是否有效。预期结果:/bin/zsh或类似。
希望这可以帮助!

1

这个问题是在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

更多详细信息可以在下面的答案中找到,那里是我得到这个命令的地方:

https://superuser.com/a/891728/1036875


0

前往 c:\cygwinc:\cygwin64(根据您的Cygwin主目录)并编辑 cygwin.bat。将以下内容替换为:

bash --login -i

例如,编写:

rem bash --login -i
tcsh -l

0
一个简单的方法是在 .bashrc 文件的末尾调用 tcsh。
#     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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接