标签: shopt

Set 和 Shopt - 为什么是两个?

setshopt都是控制各种选项的 shell 内置函数。我经常忘记哪个命令设置了哪些选项,以及设置/取消设置了哪些选项 ( set -o/+o, shopt -s/-u)。为什么有两个不同的命令看似做同样的事情(并且有不同的参数)?有什么简单的方法/助记符可以记住哪个选项与哪个命令一起使用?

bash settings shopt

89
推荐指数
5
解决办法
2万
查看次数

如何列出当前 shell 的 bash 选项?

bash 解释器本身有选项,即

bash 手册页的第 22-23 行:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  
Run Code Online (Sandbox Code Playgroud)

我在 bash 手册页中使用了一些搜索模式,例如:

  • /^\s*set
  • /list

是否可以打印应用于当前 shell 的这些设置的列表?

bash shopt

35
推荐指数
4
解决办法
2万
查看次数

设置 shopt extglob 的范围限制是什么。和其他选择?

我的非交互式 bash shell 有extglob off. 我想在命令之前的语句中打开它,但我注意到当shopt -s extglob它在一个if .. then .. else块内时,它以某种方式没有注册。

以下extglob-dependant命令无效:syntax error near unexpected token '('.

在哪里可以extglob设置,为什么会有限制?这是否适用于其他选项?... GNU bash 4.1.5

这有效:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi
Run Code Online (Sandbox Code Playgroud)

这失败了:

if true ;then
    shopt -s extglob
    touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)' 
Run Code Online (Sandbox Code Playgroud)

bash shopt

10
推荐指数
1
解决办法
1700
查看次数

为什么在 Bash 中将 histappend 设置为 off 时历史不会覆盖而是追加?

几天前,我有一个终端选项卡在做ssh,另一个在本地做很多工作。然后我重新启动了机器(在带有 Mavericks 的 Mac 上)。

当我再次运行终端时,我发现第二个选项卡的所有命令历史记录都不存在。只有ssh命令。

然后我搜索了如何以某种方式“合并”历史记录,发现我们需要shopt -s histappend在我们的~/.bashrc文件中做一个,以便历史记录将追加,而不是“覆盖”——我们不希望一组历史记录覆盖另一组放; 我们要追加。

但是,当我转到 OS X Yosemite 框并使用 时shopt,我看到它histappend已关闭,但是当我打开两个选项卡,一个执行echo abc另一个执行echo def并退出它们时,我再次重新打开终端并发出history命令,并且看到了echo abcecho def命令。

然后我在 VirtualBox 上运行 Ubuntu 2014-10 并做了类似的事情,并且仍然看到两个历史记录(我首先shopt -u histappend在两个 Bash 中运行以先将选项设置为关闭)。

那么究竟是什么机制在这样做呢?那么histappend就没有意义了,是开还是关都无所谓?

我还在shopt -s histappend我的.bashrc终端中注释掉并重新启动并再次尝试,并看到两个选项卡的历史能够组合......所以这真的很奇怪,是什么导致了它?

bash command-history shopt

10
推荐指数
1
解决办法
2151
查看次数

bash 中的多行历史条目(又名 lithist)何时可能?

bash 参考手册中,它指出:

lithist 如果启用并启用该cmdhist选项,多行命令将使用嵌入的换行符保存到历史记录中,而不是在可能的情况下使用分号分隔符。

因此我的问题是:这在哪里/何时/如何可能

我尝试在我的GNU bash 版本 4.4.12(1)-release上启用和测试该功能这样做:

shopts -s cmdhist
shopts -s lithist
echo -n "this is a test for a ";\
echo "multiline command"
Run Code Online (Sandbox Code Playgroud)

然后我做了一个

history | tail 
Run Code Online (Sandbox Code Playgroud)

期待一些类似于此的输出:

101 shopts -s cmdlist
102 shopts -s lithist
103 echo -n "this is a test for a ";\
    echo "multiline command"
104 history
Run Code Online (Sandbox Code Playgroud)

而是得到这个:

101 shopts -s cmdlist
102 shopts -s lithist
103 echo -n "this is a …
Run Code Online (Sandbox Code Playgroud)

bash command-history shopt

10
推荐指数
1
解决办法
1595
查看次数

您如何获得可用`shopt` 选项的描述?

访问内置任何可用 Shell 选项的本地文档的规范方式是什么shopt

我正在使用 Ubuntu 12.04 并且可以运行help shopt以获取有关功能的描述shopt

shopt: shopt [-pqsu] [-o] [optname ...]
    Set and unset shell options.
    ...
Run Code Online (Sandbox Code Playgroud)

我可以列出各种 Shell 选项及其值(shoptshopt -p)。但是,我如何在不离开 Linux 机器的舒适环境中了解每个人的实际情况?我不是在网上寻找描述。是否有man页面或我遗漏的东西?

bash shopt

9
推荐指数
2
解决办法
1万
查看次数

如何防止不受支持的“shopt”选项在我的 .bashrc 中导致错误?

我在一个相对异构的环境中工作,我可能在不同的 HPC 节点、VM 或我的个人工作站上运行不同版本的 Bash。因为我将我的登录脚本放在 Git 存储库中,所以我希望全面使用相同的(ish).bashrc,而没有很多“如果这个主机,那么......”类型的混乱。

喜欢Bash 的默认行为吗?4.1一个可扩展cd $SOMEPATHcd /the/actual/path按下时Tab键。在bash 4.2及以上,则需要shopt -s direxpand重新启用此行为,而并没有变得可用,直到4.2.29。不过,这只是一个例子;另一个可能相关的shopt选项complete_fullquote(虽然我不知道它的确切作用)可能也改变了 v4.2 的默认行为。

但是,direxpand早期版本的 Bash 无法识别,如果我尝试shopt -s direxpand在我的.bashrc.

-bash: shopt: direxpand: invalid shell option name
Run Code Online (Sandbox Code Playgroud)

我想做的是shop -s direxpand在 Bash > 4.1 上以一种稳健的方式包装一个条件来启用该选项,而不会影响旧版本的 Bash(,不仅仅是将错误输出重定向到/dev/null)。

bash configuration shell-script shopt

9
推荐指数
3
解决办法
1161
查看次数

在复合命令中设置 bash 选项

我发现extglob在复合化合物中设置shell 选项会导致随后的 anti-globs 失败。是否需要在复合命令之外设置 shell 选项?我在 bash 手册页中没有看到此类要求的指示。

例如,以下脚本工作正常(打印a.0 a.1):

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Run Code Online (Sandbox Code Playgroud)

但是,如果最后两行作为复合命令执行,脚本将失败并显示以下错误:

syntax error near unexpected token `('
`    ls "a."!(b*)'
Run Code Online (Sandbox Code Playgroud)

这是使用从 4.2 到 4.4 的 bash 版本和各种复合命令进行的测试

(1) 有条件的—— if

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
if true; then
    shopt -s extglob
    ls "a."!(b*)
fi
Run Code Online (Sandbox Code Playgroud)

(2) 大括号—— { }

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
{
    shopt -s extglob
    ls …
Run Code Online (Sandbox Code Playgroud)

bash shopt

9
推荐指数
1
解决办法
567
查看次数

是否有类似 tcsh 的 shopt glob 设置或设置组合?

我正在从一个长期的 tcsh 用户过渡到一个新的 bash 用户(它已经过期了)。我定期在 tcsh 中动态地编写了很多 foreach 循环,所以我学习了 bash 的 for 循环的语法作为替代,但是当不匹配的 glob 模式作为文字字符串通过循环时感到惊讶。我寻找一种方法来改变这种行为,这样文字字符串就会被跳过并找到shopt -s nullglob。我的理解是,这在理论上应该等同于 tcsh 的行为方式,但今天我发现了一个不同之处。当我这样做时ls ../*.doesnotmatch,结果是当前目录内容的列表。具体来说,我是这样做的:

重击:

$ shopt -s nullglob
$ ls ../*.sam
extractSplitReads_BwaMem    extractSplitReads_BwaMem.xml
$ shopt -u nullglob
$ ls ../*.sam
ls: ../*.sam: No such file or directory
Run Code Online (Sandbox Code Playgroud)

父目录中没有匹配的内容*.sam,尤其是当前目录。一开始我真的很困惑,但后来我意识到 glob 模式正在消失并且命令正在执行,就好像我没有提供任何参数一样,例如:

$ ls
Run Code Online (Sandbox Code Playgroud)

所以我尝试单独设置failglob和使用nullglob,但是只要设置了failglob,任何不匹配的glob模式都会终止命令,无论是否存在匹配的模式:

重击:

$ shopt -s failglob
$ shopt -s nullglob
$ ls ../vis*/*.xml
../visualization/LAJ.xml
$ ls ../vis*/*.xml ../*.sam
bash: no match: ../*.sam
$ ls ../{vis*/*.xml,*.sam} …
Run Code Online (Sandbox Code Playgroud)

bash tcsh wildcards shopt

7
推荐指数
1
解决办法
525
查看次数

调用 bash 时,选项“--rcfile /dev/null”是否与“--norc”具有相同的效果?

为了避免 XY 问题场景,我将解释为什么我问这个问题。

我记得我已经shopt -s extglob在我的~/.bashrc文件中设置了,因为这样的事情@(pattern-list)确实有效。

但是,我刚刚查看了~/.bashrc该选项并没有设置。

所以我决定看看它是从哪里来的,并发现

  • 如果我通过启动另一个shellbash --norc然后运行shopt我会看到这一行extglob off
  • 而,如果我通过 启动它bash --rcfile /dev/null,则shopt表明extglob on

这并不能真正帮助我找出设置了哪个文件extglob

根据评论,PS4=' $BASH_SOURCE:$LINENO: ' bash -lixc true |& grep extglob给出

   /usr/share/bash-completion/bash_completion:45: shopt -s extglob progcomp
   /usr/share/bash-completion/bash_completion:45: shopt -s extglob progcomp
Run Code Online (Sandbox Code Playgroud)

bash arch-linux shopt

7
推荐指数
1
解决办法
287
查看次数