Questions tagged «bash»

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


4
zsh和mksh在哪里与bash不兼容?
其他POSIX兼容外壳在多大程度上可以作为bash的合理替代品?它们不需要是真正的“即插即用”替换,但是足够接近以使用大多数脚本并通过一些修改来支持其余脚本。 我想要显式的bash脚本-初始化脚本,DHCP客户端脚本等-只需最少的修改即可工作 我希望我自己的更专业的shell脚本集合不需要太多修改 我想拥有诸如字符串操作和内置正则表达式模式匹配之类的功能 我所知道的唯一认真的竞争者是zsh和mksh。因此,对于你们中的一个或两个都擅长的人: bash分别具有zsh和mksh没有的功能? shell与bash共享哪些功能,但使用不兼容的语法呢?
11 bash  zsh  mksh 

4
在后台管道命令序列中获取任何命令的PID
如果在中bash执行: cmd1 | cmd2 | ... | cmdi | ... | cmdn & 哪里cmd{1..n}可能没有区别,我该如何获取PID cmdi?或者,我如何发信号通知该cmdi过程?(例如,发送SIGUSR1?) pkill/ pgrep,pidof等看起来不像很好的答案,因为其他情况下cmdi或许运行,包括作为同一管道的一部分。jobs -p给cmd1我的PID 。 i可以是{1..n}。
11 bash  shell  pipe  job-control 

3
在管道中较早获取命令的PID
我正在编写一个bash脚本,用于inotifywait监视目录并在检测到更改时启动操作。就像是: inotifywait -m ... | while read f; do something; done 由于inotifywait不会自行终止,因此该脚本不会停止。 所以我的计划是获取inotifywait进程的PID,将其保存到文件中,然后让另一个进程将其杀死,例如: inotifywait -m ... | { echo ??PID?? > pid-file; while ... } 但我不知道如何获取PID。有没有简单的方法可以做到这一点?另一种方法是将shell脚本的PID保存$$到文件中并杀死整个shell脚本,但是我想在while循环后进行一些清理。 我已经尝试过使用coproc,但我认为它会起作用,但似乎比所需的更为复杂。
11 bash  pipe  pid 

3
睡到下次特定时间
我需要一系列命令或一个可以休眠的命令,直到下一次出现“ 4:00”之类的特定时间为止。 我该怎么办? 该at命令或cronjob是不可选项,因为我一定不要离开当前所在的脚本。 我正在谈论的特定情况是在屏幕上运行的脚本。我不要停止脚本本身来执行脚本,这一点非常重要,因为在脚本的某些地方需要存储许多重要的变量。脚本不总是应该定期执行。它只需要在特定时间执行。 如果脚本必须创建任何文件或任何其他任务(例如cronjobs或其他屏幕),那将是非常有益的。这只是设计问题。 我只是有一个可怕的主意: difference=$(($(date -d "4:00" +%s) - $(date +%s))) if [ $difference -lt 0 ] then sleep $((86400 + difference)) else sleep $difference fi 您有更好的主意吗? 如果需要,将添加更多信息!
11 bash  date  time  sleep 

3
基于环境变量的条件分配
在bash脚本中,我要分配一个局部变量,以便该值取决于外部的全局环境变量($MYAPP_ENV)。 if [ "$MYAPP_ENV" == "PROD" ] then SERVER_LOGIN=foobar123@prod.example.com else SERVER_LOGIN=foobar987@test.example.com fi 有没有一种较短的(到目前为止还很干净)编写上述作业的方法?(大概使用某种条件运算符/内联if。)

3
替换文件时保持(或还原)文件权限
我有一个命令,该命令接受文件作为参数,修改文件,然后将其写入第二个参数中指定的文件名。我将调用该程序modifyfile。 我希望它可以“就地”运行,所以我编写了一个shell脚本(bash),将其修改为一个临时文件,然后将其移回: TMP=`mktemp` modifyfile "$original" "$TMP" mv -v "$TMP" "$original" 不幸的是,该文件的权限受到了破坏。使用默认权限重新创建该文件。 有没有办法告诉mv命令覆盖目标而不更改其权限?或者,是否有一种方法可以保存原始用户,组和权限并还原它们?

1
如何在bash终端中输入/开始新行?
我注意到一些示例循环bash分散在示例中的多行中 for VARIABLE in file1 file2 file3 do command1 on $VARIABLE command2 commandN done (例如,这里 http://www.cyberciti.biz/faq/bash-for-loop/)如何在bash终端中输入换行符(我使用腻子)?当我在一行末尾按Enter键时,系统将执行它。
11 bash  line-editor 

5
加载用户桌面后如何从脚本中进行检测?
我有一个守护程序,它以bash实现并通过cron和@reboot选项运行,该守护程序显示桌面处于非活动状态。脚本如下(出于测试目的,时间简短): #!/bin/bash P_STATE=0 while : do sleep 5 if [ $P_STATE == 0 ]; then [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on else [ `xprintidle` -le 25000 ] && P_STATE=0 done 问题:例如,如果用户仍然在登录屏幕中,xprintidle并且wmctrl由于尚未加载桌面而失败。为了避免这种情况,我在脚本的开头放置了以下几行: while: do sleep 10s [ -n `who | grep "$USER"` ] && break done …

3
bash:从-x回显转义单个行
在bash中,使用该-x选项运行时,是否可以排除单个命令的回显? 我正在尝试使输出尽可能整洁,因此我正在使用的子外壳中运行脚本的某些部分set +x。但是,该行set +x本身仍然被回显,并且没有向输出添加任何有价值的信息。 我记得在糟糕的过去.bat,与一起运行时echo on,可以通过以开头来免除单独的行@。bash有任何等效功能吗? #!/bin/bash -x function i_know_what_this_does() { ( set +x echo do stuff ) } echo the next-next line still echoes 'set +x', is that avoidable? i_know_what_this_does echo and we are back and echoing is back on 运行以上命令时,输出为: + echo the next-next line still echoes 'set …
11 bash  shell  debugging 

3
如何更改正在运行的进程的输出重定向?
我知道如何重定向输出以及如何在bash中抑制它们。现在,假设我不小心忘了输出重定向部分的命令(例如追加2>&1或> /tmp/mystdout)和我的后台进程已经运行一段时间,我还可以更改为stdout与stderr正在写入?我真的不想杀死并重新启动该应用程序。 就像吉尔斯在评论中所要求的那样,我要在以下特定情况下专门弄弄它: 错误的输出文件 忘记重定向stderr到stdout 或两者结合 例如,我正在运行Apache,并且可以看到文件描述符: /proc/8019/fd/0 -> /dev/null /proc/8019/fd/1 -> /dev/null /proc/8019/fd/2 -> /var/log/apache2/error.log

3
根据退出状态将Cron电子邮件输出到MAILTO
我有一个cron作业,运行像这样的php命令: php /path/to/script.php > dev/null 这应该仅将STDERR输出发送到MAILTO地址。根据我的收集,即使退出状态为1,php脚本也不输出任何STDERR信息。 如何获得php命令(STDOUT)的输出,并且仅在退出状态为非零的情况下将其发送给MAILTO?
11 bash  cron 

5
使用统计信息提供触摸的时间戳
我正在尝试对某些文档进行OCR(从Windows共享上的Linux命令行)。OCRing的过程已找到,而我已经使用find命令使文件正确地通过循环传输了。 但是,我需要保留原始时间戳以进行修改。我目前正在尝试使用stat并触摸如下: #!/bin/bash OLDIFS=$IFS IFS=$(echo -en "\n\b") for f in `find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"` do ORIGTS=`stat -c "%Y" $f` sudo /opt/ABBYYOCR9/abbyyocr9 -rl English -pi -if $f -f PDFA -paemImageOnText -pafpr original -of $f touch -t $ORIGTS $f done IFS=$OLDIFS 当然,触摸命令会失败。单独运行命令我注意到“ stat -c”是这样的: 1334758696 这就像我不知道约会一样。我感觉好像已经接近了,但是无法解决如何将我的约会日期转换为触摸友好版本。是某种形式的几秒钟?
11 bash  scripting  stat 

1
Home键在长输入字符串上以bash(tty和X)起作用
当我打Home,如果我的电流输入足够短(比如<36个字符),它工作正常。但是,当我键入一个较长的命令,然后又想回到开头时,它似乎已经完成了工作,但是该命令不再正确显示。好像我不是刚开始,但要离开大约10个字符。尽管如果我键入“ blindly”,它可以正常工作,但看起来像是一团糟,好像整个输入都移到了右边,但没有重绘。因此,我键入了它,但实际上没有键入,因为我要“擦除”的位置在右边“实际上”是10个字符。因此,如果我尝试擦除该命令,则仍显示前10个字符,但是如果我单击Enter它,则仅显示另一个提示,就好像先前的输入为空。 我知道这不是有史以来最好的解释,但关键是bash能够识别它并尝试做正确的事情,但经常失败。 我在tty和X会话的终端中都重现了这一点。当我按下Ctrl+时V,Home我看到了不同的序列(^[OH在X中,^[[1~在tty中),但是两者似乎都在我的体内/etc/inputrc: # do not bell on tab-completion #set bell-style none set meta-flag on set input-meta on set convert-meta off set output-meta on $if mode=emacs # for linux console and RH/Debian xterm "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[7~": beginning-of-line "\e[3~": delete-char "\e[2~": quoted-insert "\e[5C": forward-word …

4
Bash路径补全如何与sudo一起使用?
制表符路径补全不适用于(至少在Ubuntu和AFAIK Arch上)与 sudo mount <whatever> 我尝试挂载的iso文件不在中/etc/fstab。如果我只是输入 mount <whatever> 完成工作正常(但命令失败,因为我不是root用户)。显然是sudo打破了它。 如何使sudo完成工作? 令人惊讶的是 sudo umount <whatever> 完成工程。如何实现的?会调查/etc/fstab吗? 解决方案:我只是将一个shell脚本放入传递了参数的/usr/local/bin调用中sudo mount ...。调用此脚本时,完成是可行的,因为这样做不会成功sudo。

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.