在更新shell之后,.bashrc中找不到shopt命令。

107

我已经将我的shell更新为ZSH。当我执行source ~/.bashrc时,出现了以下错误:

在执行这个命令时,“yo doctor”出现了一些错误。

echo "export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules" >> ~/.bashrc && source ~/.bashrc
请帮我解决这个问题。

/home/amerrnath/.bashrc:17: command not found: shopt /home/amerrnath/.bashrc:25: command not found: shopt /home/amerrnath/.bashrc:109: command not found: shopt /usr/share/bash-completion/bash_completion:35: parse error near `]]'


6
“zsh” 不是 “bash”。你为什么要引用 “.bashrc”? - FatalError
2
你的 bashrc 文件是为 bash 编写的。zsh 不是 bash。我很惊讶它竟然试图加载你的 .bashrc。如果没有加载,而你是从 .profile 或类似文件手动引用它,请停止这样做。然后用适当的 zsh 初始化文件替换它。 - Etan Reisner
post that as an answer - ErlVolton
1
不,你不想~/.bashrc。你想找出如何编写一个~/.zshrc文件,在zsh中执行与.bashrcbash中执行相同的操作。 - chepner
如果你想切换到Bash,可以执行 bash 命令,然后执行 ~/.bashrc - absin
显示剩余2条评论
8个回答

174

zsh使用环境配置文件~/.zshrc,而不是~/.bashrc

所以您需要将您的环境设置追加到.zshrc文件中,然后

source ~/.zshrc

它必须正常工作。

rbenv GitHub链接


18
这并不解释为什么“shopt”在Bach中有效(因为它不是Bash内置命令)。 @Omnipresence的回答更具有信息量。 - Jorge Orpinel Pérez
1
你不需要执行 source .zshrc 命令,因为 zsh 会自动加载它。 - M A Hossain Tonu
是的,但如果你想在当前上下文中立即加载新配置,你需要刷新它。 - sudoz
我的 echo $SHELL 的输出为 /bin/zsh,我的 .zshrc 已经准备就绪。所有的 .bashrc, .bash_profile, /etc/profile//etc/bashrc 都已被注释掉。默认 shell 是 zsh,macOS 是最新版本 (Catalina 10.15.4),但是每当我运行任何 pyenv 命令时都会遇到完全相同的问题。我尝试将默认 shell 更改为 bash,在那里也出现了相同的问题。这是否意味着我的操作系统已经损坏? - saadi
@saadi 将 pyenv 的路径添加到 .zshrc 文件中。 - sudoz
@sudoz,我已经在这里更新了,我已经添加了路径。penv位于/usr/local/bin/,该目录已经添加到路径中,这就是为什么我没有收到“pyenv”命令未找到的提示,而是出现了“shopt”命令未找到的提示。 - saadi

83

将任何内容放入~/.bashrc文件中:

切换至bash:

exec bash

那么

source ~/.bashrc

切换到bash不会影响新的终端窗口。但如果你想将当前窗口切换到zsh。

切换到zsh:

exec zsh

参考资料


2
这应该是我认为正确答案,因为一些设置是由安装软件处理而不是我个人处理。 - David Kabii
谢谢您提供的时间节省工具 :) - Amitesh Rai
我能否只使用 bash 关键字来切换? - alper
如果我们只需要偶尔运行bash,那么这个解决方案将是最好的。 - Mai Hai
哦,我的天。这个答案使我免于遇到成千上万的问题,谢谢您的发布 :) - MukulCode
显示剩余2条评论

65

shopt不是一个命令,而是一个shell内置命令。因为它是bash内置命令,所以bash知道该怎么使用它,但是zsh不知道这是什么。你需要查看setopt,这是一个zsh内置命令,并将这些值放入新的.zshrc脚本中。


你能帮我学习如何使用setopt来操作这个shopt吗? - Amerrnath
1
这不是一个简单的请求。你的.bashrc文件至少有109行,而且我不知道其中有多少是注释或空格。我只能建议你浏览一下你的.bashrc文件,弄清楚它在做什么,然后找出如何在zsh中完成相同的事情。如果你从未自定义过.bashrc,那么也许你只需要将命令改为:echo "export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules" >> ~/.zshrc && source ~/.zshrc - Omnipresence
这是问题的实际答案!谢谢! - Mike B

25

将shopt创建别名并通过zsh调用

这里描述了一个快速解决方案:https://github.com/larz258/Zshopt

sudo vi /usr/bin/shopt

店里面

#!/bin/bash
args='';
for item in $@
  do
    args="$args $item";
  done
shopt $args;
使其可执行。
sudo chmod +x /usr/bin/shopt
在你的 .zshrc 文件中创建一个别名。
echo "alias shopt='/usr/bin/shopt'" >> ~/.zshrc

11

你的bashrc文件是为bash编写的,zsh不是bash

我很惊讶zsh竟然试图加载您的.bashrc文件。

如果它没有这样做,并且您正在手动源化它(从.profile或类似位置),请停止这样做。

然后,您需要编写一个适当的zsh初始化文件。

如果要使用zsh,则需要使用zsh而不是bash

shopt是特定于bash的。

[[是特定于bash的。


echo "export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules" >> ~/.bashrc && source ~/.bashrc。当我在我的shell中执行此命令时,我会收到这个错误。 - Amerrnath
@user1475089 是的,因为你的.bashrc文件包含了一些不合法的zsh内容。你需要停止这样做。如果你想在你的zsh shell中使用那个导出命令,你应该将其放入你的zsh初始化文件而不是.bashrc文件中。 - Etan Reisner
你能否稍微详细地给我解释一下? - Amerrnath
2
@user1475089 你正在尝试在zsh中使用bash内置功能。这只能勉强比用叉子吃汤好一点。你需要停止使用叉子来吃汤,开始学习如何使用勺子。(去了解一下zsh以及如何使用它实现你想要的功能...或者停止使用zsh,回到使用bash。) - Etan Reisner

6

shopt不是一个命令,而是一个内置于shell中的功能。你可以在bash中运行以下命令来确认:

type shopt

输出结果为:

shopt is a shell builtin

解决方案:

步骤1:

echo "#! /bin/bash\n\nshopt \$*\n" > /usr/local/bin/shopt

然后您将获得 /usr/local/bin/shopt:
#! /bin/bash

shopt $*

Step2:
chmod +x /usr/local/bin/shopt

步骤3:

ln -s /usr/local/bin/shopt /usr/bin/shopt

第四步:

echo "alias shopt='/usr/bin/shopt'" >> ~/.zshrc

2
大多数情况下,您正在尝试在zsh shell中执行bash命令。
使用以下命令切换到bash: exec bash 或者 bash 然后继续输入以下命令: source .bashrc

1

由于某种原因,在从16.04升级到17.10和18.04后,符号链接/bin/sh被重置为dash而不是bash。更新此链接:

sudo cd /bin && ln -sf bash sh

为我解决了这个问题


在搜索了一段时间原因后,我发现了这个方法,可以解决终端中没有历史记录和命令补全的问题。其中之一是“HISTFILE -sh:history:not found”。在将用户添加到Ubuntu服务器后出现了这个问题。希望这行代码能帮助其他人更快地找到它... - novski

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