Questions tagged «bash»

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


1
为什么这些bash fork炸弹的工作方式不同,&在其中的意义是什么?
我知道普通的叉子炸弹是如何工作的,但是我真的不明白为什么在普通bash叉子炸弹的末尾需要&,以及为什么这些脚本的行为有所不同: :(){ (:) | (:) }; : 和 :(){ : | :& }; : 前者会导致CPU使用率激增,然后再将我带回到登录屏幕。后者反而只会导致我的系统死机,迫使我硬重启。这是为什么?两者都不断创建新流程,那么为什么系统的行为有所不同? 这两个脚本的行为也与 :(){ : | : }; : 即使我希望它们都一样,这也根本不会引起任何问题。bash手册页指出管道中的命令已经在子shell中执行,因此我被认为::应该已经足够了。我相信,应该在新的子Shell中运行管道,但是为什么会有如此大的变化? 编辑:使用htop并限制进程数量,我能够看到第一个变量创建了一个实际的进程树,第二个变量创建了同一级别的所有进程,而最后一个变量似乎未创建任何进程完全没有 这使我更加困惑,但是也许可以有所帮助?

7
使用目录树/文件名时的紧凑bash提示
在具有Ubuntu 14.04和的系统中bash,我具有PS1以以下内容结尾的变量: \u@\h:\w\$ 因此提示显示为 user@machinename:/home/mydirectory$ 但是,有时,当前目录的名称很长,或者它位于内部名称很长的目录中,因此提示看起来像 user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$ 这将填充终端中的行,并且光标将移至另一行,这很烦人。 我想获得类似的东西 user@machinename:/home/mydirectory1/...another_long_name$ 有没有一种方法可以定义PS1变量来“包装”和“压缩”目录名称,以使其不超过一定数量的字符,从而获得较短的提示?

2
为什么在bash管道上使用`yes'不会*导致无限循环?
根据其文档,bash会一直等到管道中的所有命令运行完毕,然后再继续 在返回值之前,shell等待管道中的所有命令终止。 那么,为什么命令yes | true立即完成?不应yes永远循环并导致管道永不返回吗? 还有一个子问题:根据POSIX规范,shell管道可以选择在最后一条命令完成之后返回,或者等待直到所有命令完成。从这个意义上说,普通的壳有不同的行为吗?是否有任何壳yes | true会永远循环?
16 bash  shell  pipe 

2
“ </ dev / null”是什么意思?
我了解&gt; /dev/null将事物重定向到/dev/null类似黑洞的行为。但是,我不明白这&lt; /dev/null意味着什么。我看到了一些这样写的脚本: nohup myprogram &gt; foo.out 2&gt; foo.err &lt; /dev/null &amp; 那么,&lt; /dev/null上面的代码是什么意思呢? 这是一个建议的例子
16 bash 

5
这是bash中的错误吗?如果从管道调用`return`不会退出功能
最近我在使用bash时遇到了一些奇怪的问题。在尝试简化脚本时,我想到了以下一小段代码: $ o(){ echo | while read -r; do return 0; done; echo $?;}; o 0 $ o(){ echo | while read -r; do return 1; done; echo $?;}; o 1 return应该没有打印就退出了功能$?,不是吗?好吧,然后我检查了是否可以单独从管道返回: $ echo | while read -r; do return 1; done bash: return: can only `return' from a function …

2
使用管道和此处字符串的资源使用情况
我们可以使用以下两个in中获得相同的结果bash, echo 'foo' | cat 和 cat &lt;&lt;&lt; 'foo' 我的问题是,就所使用的资源而言,这两者之间有什么区别?哪个更好? 我的想法是,在使用管道时,我们使用了额外的进程echo和管道,而在此字符串中,仅文件描述符与一起使用cat。
16 bash  pipe  resources 


6
Shell:“显示所有2588种可能性吗?”
因此,我在四处移动笔记本电脑(并且习惯于在键盘上进行设置...),然后醒来发现了这一点: $ 显示所有2588的可能性?(是或否) 什么命令将显示类似这样的内容? 我正在使用Bash。
16 bash  shell 

2
bash中set -k选项的实际用法
我们什么时候set -k在bash中使用option? Bash参考手册说, 所有赋值语句形式的参数都放置在命令环境中,而不仅仅是命令名称之前的参数。 我了解该选项的作用,但是无法想象我们何时需要它。
16 bash  shell 

1
重击以逗号分隔的值
我想为逗号分隔的参数列表创建完成规则。例如,我有接收服务器名称列表的命令: myscript -s name1,name2,name3 现在,我已经完成以下工作: _myscript () { local cur prev opts _get_comp_words_by_ref cur prev opts='-s' servers='name1 name2 name3' if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) else case "${prev}" in -s) if [[ "$cur" == *,* ]]; then local realcur prefix realcur=${cur##*,} …

5
有状态的bash功能
我想在Bash中实现一个函数,该函数在每次调用时都会增加(并返回)计数。不幸的是,这似乎很简单,因为我正在子外壳中调用该函数,因此它无法修改其父外壳的变量。 这是我的尝试: PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } 这将按如下方式使用(因此需要从子shell调用函数): PS1='$(ps_count_reset)&gt; ' PS2='$(ps_count_inc) ' 这样,我将获得一个编号的多行提示: &gt; echo 'this 1 is 2 a 3 test' 可爱。但由于上述限制,因此无法使用。 不可行的解决方案是将计数写入文件而不是变量。但是,这会在多个同时运行的会话之间产生冲突。当然,我可以将Shell的进程ID附加到文件名中。但是我希望有一个更好的解决方案,它不会使我的系统中包含很多文件。

4
将当前目录中的每个pdf转换为png
我想编写一个bash脚本,将.pdf当前目录中的每个文件转换为一个.png文件。例如: $ls . a.pdf b.pdf $./pdf2png.sh Converting pdfs to pngs a.pdf -&gt; a.png b.pdf -&gt; b.png 这是我的最佳尝试: #!/bin/bash convert -verbose -density 500 -resize '800' a.pdf a.png convert -verbose -density 500 -resize '800' b.pdf b.png
16 bash  imagemagick 

4
如何在readline中切换到vi编辑模式?
我想在readline环境中切换到vi编辑模式。但是我不想使用'set -o vi'。我想使用键盘快捷键临时切换。手册页上说我可以用M-C-j。但这对我不起作用。 我正在使用Ubuntu和xterm。在gnome-terminal下也不起作用。
16 bash  readline 

5
使用生成的文件名列表作为参数列表-带空格
我正在尝试使用收集的文件名列表调用脚本find。没什么特别的,只是这样: $ myscript `find . -name something.txt` 问题在于某些路径名包含空格,因此在参数扩展时它们会分解为两个无效的名称。通常,我会在名称两边加上引号,但是在这里,它们会由反引号扩展插入。我试过find用引号过滤每个文件名的输出并用引号引起来,但是当bash看到它们时,剥离它们已经为时已晚,它们被视为文件名的一部分: $ myscript `find . -name something.txt | sed 's/.*/"&amp;"/'` No such file or directory: '"./somedir/something.txt"' 是的,这是处理命令行的规则,但是如何解决呢? 这很尴尬,但我没有提出正确的方法。我终于想出了解决方法,但是xargs -0 -n 10000...我仍然想问这个丑陋的hack:我该如何引用反引号扩展的结果,或者以其他方式实现相同的效果? 编辑:我对xargs 确实将所有参数收集到一个参数列表中的事实感到困惑,除非被告知否则可能会超出系统限制。感谢大家使我挺直!其他人,在阅读已接受的答案时,请记住这一点,因为它不是很直接地指出。 我已经接受了答案,但我的问题仍然存在:是否存在某种方法来保护反引号(或$(...))扩展中的空间?(请注意,可接受的解决方案是非强制性的答案)。

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.