Questions tagged «bash»

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



2
设置-u用法未按预期工作
我正在学习如何set在脚本中有效使用不同的选项,并且发现set -u如果变量未正确设置(例如删​​除用户),退出脚本似乎是完美的选择。根据手册页,set -u并set -e执行以下操作... -e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting. 我创建了一个测试脚本来测试此功能,但似乎无法正常工作。也许有人可以更好地向我解释我的问题,而我在哪里曲解?测试脚本如下。谢谢。 set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} testing3="This should not appear" echo $? echo ${testing3} 我希望脚本显示0和“ This …

1
“ wait&”(“ wait&”符号)是有用的(流行的)shell / shell脚本惯用法或技巧吗?
我已经“继承”了运行GNU“ bash” shell的Linux机器的一些shell脚本。在一种特定情况下,机器运行GNU bash版本2.0.5b 这些脚本之一有一个wait &(“&”符号)作为for循环“ for行”的一部分。乍一看,这似乎是一种好奇/有趣的习惯用法,但是我在网上搜索时并未返回任何相关信息。man wait显示了“ BASH_BUILTINS”(“ BASH BUILTINS COMMAND”)联机帮助页,该联机帮助具有以下描述: wait [n] Wait for the specified process and return its termination status. n may be a process ID or a job spec­ification; if a job spec is given, all processes in that job's pipeline are waited for. If …

3
在bash上使用户键入的密码成为程序的stdin的最安全和最简单的方法是什么?
我正在寻找(1)最安全和(2)最简单的方法,让用户在bash shell提示符下键入密码,并使该密码成为程序stdin的一部分。 这是stdin需要的样子:{"username":"myname","password":"<my-password>"},在<my-password>shell提示中键入的内容在哪里。如果我可以控制stdin程序,则可以对其进行修改以安全地提示输入密码并将其放置到位,但是下游命令是标准的通用命令。 我已经考虑并拒绝了使用以下方法: 用户在命令行中输入密码的密码:该密码将显示在屏幕上,并且也将通过“ ps”显示给所有用户 shell变量插值到外部程序的参数中(例如...$PASSWORD...):通过“ ps”,所有用户仍然可以看到密码 环境变量(如果它们留在环境中):密码对所有子进程都是可见的;如果可信赖的进程在诊断中转储核心或转储环境变量,它们甚至可能会暴露密码。 密码在文件中放置的时间过长,甚至是权限很严格的文件:用户可能会意外泄露密码,而root用户可能会意外看到密码 我在下面将我当前的解决方案作为答案,但是如果有人提出一个答案,我会很乐意选择一个更好的答案。我认为应该有一些简单的方法,或者可能有人看到我错过的安全问题。
12 bash  security  password  curl 


7
测试文件描述符是否有效
我想让bash脚本在打开时将附加信息输出到大于或等于3的文件描述符(FD)。为了测试FD是否打开,我设计了以下技巧: if (printf '' 1>&3) 2>&-; then # File descriptor 3 is open else # File descriptor 3 is not open fi 这足以满足我的需求,但是我很好奇是否有一种惯用的方法来测试FD是否有效。我特别是约是否存在所述的映射感兴趣fcntl(1)系统调用到外壳命令,这将允许FD标志的检索(O_WRONLY和 O_RDWR测试的FD是否可写,和O_RDONLY和 O_RDWR测试的FD是否可读)。

2
如何撤消命令历史记录中的更改?
在UNIX系统中,您可以按上下箭头浏览先前的命令。这非常方便。 有时,我会上去查找要再次使用的命令,但是会有一些变化。如果我做了这样的更改,那么除非我签入,否则我将无法取回原始命令history。 有什么方法可以“撤消”通过键访问的历史记录中的命令更改? 我当前的解决方法是#在命令前添加a 。这样,当前命令将作为注释执行,因此没有任何反应。然后,我可以再次通过按键浏览命令。问题是我使用的命令可能在列表中距离很远,因此再次向上执行200次会有点麻烦。Control + R也不是解决方案,因为我可能不记得确切要找什么。 例 我输入了以下“ 50个命令之前”: ls -l /etc/httpd/conf/ 现在我走到那条线并将其更改为 ls -l /etc/init.d/ 但没有按Enter。现在,我想ls -l /etc/httpd/conf/再说一遍。 我的环境 $ echo $SHELL /bin/bash $ echo $TERM xterm

4
计算目录中具有名称特定字符串的文件?
我有以下文件: Codigo-0275_tdim.matches.tsv Codigo-0275_tdim.snps.tsv FloragenexTdim_haplotypes_SNp3filter17_single.tsv FloragenexTdim_haplotypes_SNp3filter17.tsv FloragenexTdim_SNP3Filter17.fas S134_tdim.alleles.tsv S134_tdim.snps.tsv S134_tdim.tags.tsv 我想计算snp名称中带有单词(区分大小写)的文件的数量。我尝试使用 grep -a 'snp' | wc -l 但后来我意识到可以grep在文件中进行搜索。扫描文件名的正确命令是什么?
12 bash 

2
创建变量并通过循环(bash)分配值
有没有一种方法可以创建bash变量并通过循环为它们分配值? 类似于以下内容: #!/bin/bash c=0 for file in $( ls ); do var"$c"="$file"; let c=$c+1; done 编辑:感谢@Costas和@mdpc指出这将是列表的替代方案;这个问题只是理论上的。

3
有没有一种方法可以让我的bash脚本在任何命令错误时自动运行?
我正在编写一个需要执行一系列命令的shell脚本,每个命令都取决于每个先前的命令。如果有任何命令失败,则整个脚本将失败,我将调用退出函数。我可以检查每个命令的退出代码,但是我想知道是否存在可以启用的模式或一种使bash自动执行此操作的方法。 例如,使用以下命令: cd foo || myfunc rm a || myfunc cd bar || myfunc rm b || myfunc 有没有一种方法可以在执行这些命令之前以某种方式向外壳发出信号,如果它们中的任何一个失败,它应该调用myfunc,这样我可以编写一些更简洁的代码,例如: cd foo rm a cd bar rm b

5
找到一些文本后如何阅读某些行?
找到一些文本后如何阅读一定数量的行? 例如。: 在以下位置找到“ Unix”后,请阅读下两行: Test 1 Test 2 Test 3 Test 4 UNIX Test 5 Test 6 Test 7 Test 8 Test 9 结果可以是: Test 5 Test 6 注意:最后一个示例中的“ Unix”是一个参数,因此,它可以是任何其他文本。 我拥有的: 我仍然没有主意,只需要一点灯。考虑创建另一个脚本来做到这一点。
12 bash  shell 

5
非交互式外壳扩展别名
运行以下命令时,我无法在主机帐户上扩展别名: ssh user@server "bash -c \"alias\"" 我的.bashrc文件是: echo .bashrc # .bashrc shopt -s expand_aliases # Source global definitions (commenting this out does nothing) if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions alias php="php55" alias composer="php ~/bin/composer.phar" 当我运行上面的ssh命令时,我确实看到了“ .bashrc”回显。但是,如果我尝试运行别名,我将一无所获。 我可以尝试“ bash -ic”,但这实际上是在脚本中,我无法轻易对其进行更改,并且我想知道为什么它不起作用。 输出 ssh …
12 bash  ssh  alias  bashrc 

3
如何在底部提示时启动XTerm?
启动XTerm时,提示从终端的第一行开始。运行命令时,提示会向下移动直到到达底部,然后一直停留在底部(甚至不行Shift- Page Down否则鼠标可以更改此值)。并非让终端生命周期的开始是“特殊的” ,而是提示应始终位于终端的底部。请注意,我有多行提示。 当然,它应该像以前一样工作(可调整大小,可滚动,输出中没有不必要的换行符,并且输出不会神秘地消失),因此PROMPT_COMMAND='echo;echo;...',类似的选择是不可行的。理想情况下,解决方案不应是特定于外壳的。 编辑:在目前的解决方案,在简单的情况下工作时,有几个问题: 它是针对Bash的。理想的解决方案应可移植到其他外壳。 如果其他进程进行了修改,PS1它将失败。一个例子是的virtualenv,这增加了(virtualenv)在开始的PS1,然后总是消失只是倍以上。 Ctrl- l现在删除历史记录的最后一页。 除了分叉XTerm之外,还有什么方法可以避免这些问题?
12 bash  terminal  xterm 

2
在路径中禁用bash的可执行文件缓存
请注意,这不是重复项。我要问的是禁用缓存,而不是清除它。如果您有要清除的缓存,则显然不会禁用它。 在极少数情况下,我会注意到bash在路径中发现的东西缓存,这并不是因为它有用,而是因为它令人讨厌。一个例子: ~ dc$ export PATH=$HOME/bin:$PATH ~ dc$ cat bin/which #!/bin/bash echo "my which" ~ dc$ which my which ~ dc$ rm bin/which ~ dc$ which which -bash: /Users/dc/bin/which: No such file or directory 在另一个外壳... ~ dc$ which which /usr/bin/which 我敢肯定,这种高速缓存在磁盘速度慢,内存昂贵且有限的美好旧时光中很有意义,因此您不能缓存太多-缓存路径比缓存查找命令所需的所有磁盘块便宜。但是这些天来,它并没有带来明显的好处,并且带来了许多无法解决的问题。这是一个错误的功能,很快就会成为错误。 而且我什至找不到禁用它的方法。有指针吗?
12 bash 

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.