Questions tagged «bash»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。

1
使用具有tty输出的可变命令对stdin和stdout进行配管时,zsh无法输入到终端
系统信息: macOS Sierra 10.12.6 zsh 5.4.2 (x86_64-apple-darwin16.7.0) GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0) 滚动到示例在底部,如果你只是想挖成简单的例子,我做。 注意:我不是一个大zsh用户。 我一直在寻找在fzf按键绑定的bash和zsh。 注意它们都是如何运行可变命令的$(__fzfcmd)。__fzfcmd默认情况下,输出fzf到stdout,并且参数替换仅运行fzf由输出产生的命令()。 bash和zsh脚本之间的区别是,bash另一个脚本通过管道传递输出,$(__fzfcmd)但zsh仅将其捕获到数组中。我的猜测是由于一个问题,zsh当您进一步通过管道传输fzf无法输入的位置的输出时,fzf通过管道传输到的过程fzf不会得到任何标准输入。您唯一的选择是to ^Z或^C。^C由于某种原因,似乎使该过程成为背景。或者,也许他们只是想以阵列的形式使用它们,以便可以在其上运行zle vi-fetch-history。该bash版本在与"\e^": history-expand-line 现在fzf并不重要。似乎您只需要一个输出到的程序tty就可以通过参数替换来调用该程序,从而导致此问题。因此,我将显示一些更简单的示例。 这是一些其他输出到的命令,这些命令tty可能会导致以下问题zsh: vipe(在管道中间运行编辑器) 'vim -' (使vim从stdin读取。类似于vipe,但不会输出到stdout) 在下面的例子中,更换的每次出现vipe用vim -,如果你不想做一个单独的安装。只是要记住,vim -不会像vipe那样将编辑器内容输出到stdout 。 例子: 1) echo 1 | vipe | cat # works in both bash and zsh 2) echo 1 | $(echo …
11 bash  zsh  pipe  tty 

2
Bash脚本没有看到SIGHUP?
我有以下脚本: #!/bin/bash echo "We are $$" trap "echo HUP" SIGHUP cat # wait indefinitely 当我发送SIGHUP(使用kill -HUP pid)时,没有任何反应。 如果我稍微更改脚本: #!/bin/bash echo "We are $$" trap "kill -- -$BASHPID" EXIT # add this trap "echo HUP" SIGHUP cat # wait indefinitely ...然后脚本在echo HUP退出时会正确执行操作(当我按Ctrl + C时): roger@roger-pc:~ $ ./hupper.sh We are 6233 ^CHUP …
11 bash  signals 

3
$ HOME / bin目录不在$ PATH上
在我~/.profile的最后一个代码块中,应该这样加载我的个人代码bin/ directory: # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi 但它似乎未加载: echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 为什么这不起作用?(我的shell是bash。) 编辑跳跳虎 echo $0 => bash echo $HOME => /home/student whoami => student less /etc/*-release => PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" …

3
BASH和回车行为
我有一个简单的问题。 bash(我使用的是4.4.11)显示的行/文本以纯文本分隔/结尾是否正常\r? 我对这种行为感到有些惊讶: $ a=$(printf "hello\ragain\rgeorge\r\n") $ echo "$a" george 但是“ hello again”文本仍然存在,以某种方式“隐藏”: $ echo "$a" |od -w32 -t x1c 0000000 68 65 6c 6c 6f 0d 61 67 61 69 6e 0d 67 65 6f 72 67 65 0d 0a h e l l o \r a g a …

3
`>> / dev / stderr`(带有空格)和`>&2`有什么区别?
猛扑 我在确定应该使用什么方面遇到一些困难? 我所有的脚本都使用“ >> / dev / stderr” 在bash提示下,如果我尝试: echo test >>/dev/stderrworks echo test >> /dev/stderrworks echo test >/dev/stderrworks echo test > /dev/stderrworks echo test >>&2失败! echo test >> &2失败! echo test >&2作品 echo test > &2失败! 我愿意将所有脚本更改为>&2。 它对ssh似乎也有很大的影响(在之后su SomeUser),在ssh >>/dev/stderr根本不起作用(权限被拒绝),只会>&2起作用。


4
是否有可能是非交互式的登录外壳?
在解释此流程图时 我发现在男子bash中: 当bash作为交互式登录shell或通过--login选项作为非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。 声明交互式登录外壳读取/etc/profile(不带--noprofile) 另外,非交互式外壳,选项为--loginread/etc/profile 这似乎留下了一些可能的登录外壳程序(其中以$0开头的-)可能是非交互的(运行脚本,可能像这样简单date)可能无法读取(源代码)/etc/profile。 确认或否认这个想法: 首先,我尝试使用su -l -,-以第一个字符开头的登录shell,但是我无法使其变为非交互式(并能够提供测试以测试它)。 叫类似 $ bash -c 'date' -bash 不会报告为登录外壳程序(即使第一个字符是-)。 尝试一下以揭示细节: $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016 该$0有-作为第一个字符,没有i在价值(交互)$-,但它未报即一个login_shell(在-u)。在这种情况下,/ etc / profile没有被读取,但是我不确定这是正确的测试。 在此答案中还提到了“罕见的非交互式登录外壳” ,但对这个问题不够具体。 这个家伙的结论是,/etc/profile总是读。 阅读摘要表:交互式和非交互式登录shell均已阅读 …
11 bash  login  startup  bashrc 


1
bash在交互式Docker容器中无法正确调整大小
每次终端大小更改时,通常bash都会resize自动更改,以便正确地重新计算LINES和COLUMNS。但是由于某种原因,它不能在bash交互式运行的Docker容器中工作。 我有shopt checkwinsize -s我bashrc的泊坞窗容器(并验证它on使用shopt)。与主机bash会话相同。 我真的没主意了;shopt checkwinsize -s是我发现的唯一一种可以在调整窗口大小时bash自动评估resize的方法。
11 bash  docker 

4
每次显示新提示时,Bash提示执行命令
我在bash中有以下提示,其中显示了当前的git分支: PS1+="$(git_prompt)" #git_prompt is a function in my .bashrc 当我获取.bashrc时有效,但当我更改分支时无效,因此PS1 var仅在我获取.bashrc时得到评估,但每次显示新提示时都应对其进行评估。如何使用bash 4.3做到这一点?
11 bash  prompt 

2
计算bash数组中元素的数目,其中数组名称是动态的(即存储在变量中)
问题的简要说明: 是否有内置的bash方法来计算bash数组中元素的数量,而该数组的名称是动态的(即存储在变量中),而无需求助于对该数组的完全复制或使用eval? 更多信息: 使用bash参数替换,可以执行以下操作: 确定数组的长度: myArr=(A B C); echo ${#myArr[@]}。 通过名称间接引用变量:( NAME=myVar; echo ${!NAME}这也适用于数组元素): NAME=myArr[1]; echo ${!NAME} 但是,如果数组的名称存储在另一个变量中,那么如何确定数组中元素的数量呢?(可以将其视为上述两个参数替换的组合。)例如: myArr=(A B C D) NAME=myArr # Get the number of elements in the array indirectly referenced by NAME. count=${#$NAME[@]} # This syntax is invalid. What is the right way? 以下是所有失败的多次尝试: # Setup …

1
bash变量分配中的单括号
我想知道bash中的单个括号。我知道它们用于在子shell中执行命令,并且它们用于创建数组,但是它们还用于其他吗? 引起我注意的一件事是,当您使用in变量赋值时,例如 var=(hello) echo $var # hello bash不会产生错误或任何东西,并且输出与 var=hello 这两个变量定义是相同的还是有区别的?
11 bash  array 

2
重击僵尸
Bash似乎不会制造僵尸。看起来这些进程在被杀死时会立即收获。 我可以让bash变成僵尸吗? 我为什么要问: 我希望能够安全地杀死一个子进程,或者kill -9如果它在一定时间内没有消失,则可以安全地杀死它,但是我不想意外破坏不是我的子进程的进程。僵尸进程通常非常容易,而且在竞争条件下也很安全。
11 bash  process 

2
重击:“历史编号”与“命令编号”
在谷歌搜索如何通过PS1变量自定义我的shell提示时,我看到了可以使用的特殊字符表。特别是: \! the history number of this command \# the command number of this command “历史编号”似乎更常用,并且我知道如何使用命令!523来从历史中重做命令。但是我不知道“命令号”是否具有类似的功能。我尝试放入\#PS1变量,它似乎输出在特定会话中输入的命令数(与不同\!,它在注销/退出后仍然存在)。 有人知道如何以方便或有意义的方式使用“命令号”吗?

4
了解Bash的读取文件命令替代
我试图了解Bash如何正确对待以下行: $(< "$FILE") 根据Bash手册页,这等效于: $(cat "$FILE") 我可以遵循第二行的推理路线。Bash在上执行变量扩展$FILE,输入命令替换,将$FILEto 的值传递cat,cat将其内容$FILE输出到标准输出,命令替换通过用内部命令产生的标准输出替换整行来完成,Bash尝试像执行一个简单的命令。 但是,对于我上面提到的第一行,我的理解是:Bash在上执行变量替换$FILE,Bash打开$FILE以读取标准输入,以某种方式将标准输入复制到标准输出,命令替换完成,并且Bash尝试执行生成的标准输出。 有人可以向我解释$FILEstdin到stdout 的内容如何吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.