Questions tagged «shell»

Shell是Unix的命令行界面。您可以交互地在外壳程序中键入命令,也可以编写脚本来自动执行任务。使用此标记可解决适用于/ bin / sh和大多数兼容shell(ash,bash,ksh,zsh等)的问题。对于有错误的Shell脚本,请在此处发布之前在http://shellcheck.net中对其进行检查。

5
如何根据星期几使用If-Else查询?
问题:我需要检查今天是否是星期四,并根据这种情况的结果执行不同的操作。我尝试了两种不同的方法: 获取日期名称: DAYOFWEEK=$(date +"%a") echo DAYOFWEEK: $DAYOFWEEK if ["$DAYOFWEEK" == "Thu"]; then echo YES else echo NO fi 获取日数: DAYOFWEEK=$(date +"%u") echo DAYOFWEEK: $DAYOFWEEK if ["$DAYOFWEEK" == 4]; then echo YES else echo NO fi 在这两种情况下,即使应为“是”,输出也为“否”。怎么了?

2
比较时间的好方法?
我需要检查当前时间,如果不是我应该运行它的一天中的适当时间,则中止脚本。另外,如果其他任何人运行它,它都应该中止。 例如:我需要脚本仅在10 PM到2 AM(4小时窗口)之间启动时才能运行。 目前,我正在执行以下操作。花时间date +%k%M与硬编码进行比较 #!/bin/sh currTime=`date +%k%M` check_time_to_run() { tempTime=$1 if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then echo "Time is between 2 AM and 10 PM. Aborting." exit 1 else echo "Time is after 10 PM and before 2 AM. Running normally." fi } …

2
处理从find命令通过管道传输的文件名
我是Bash的新手,正在尝试做一些表面上看起来很简单的事情-在目录层次结构上运行find以获取所有* .wma文件,将输出管道传输到命令,然后将它们转换为mp3并将转换后的文件另存为.mp3。我的想法是该命令应如下所示(我不再使用音频转换命令,而是使用echo作为示例): $ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3 据我了解,-print0 arg将允许我处理具有空格的文件名(其中许多文件是音乐文件)。然后,我期待(由于xargs的原因)find中的每个文件路径都在f中捕获,并且使用子字符串match / delete从字符串末尾开始,我应该用mp3回显原始文件路径扩展名而不是wma。但是,我看到的不是这个结果,而是: *.mp3 *.mp3 *.mp3 *.mp3 *.mp3 *.mp3 *.mp3 *.mp3 *.mp3 ... 所以我的问题(除了特定的“我在这里做错了什么”之外)是吗?在字符串操作操作中,是否需要对管道操作结果所产生的值与变量赋值所导致的值进行不同的处理? ?

1
交互式外壳在孤立的流程组中应该做什么?
(根据/programming/13718394/what-should-interactive-shells-do-in-orphaned-process-groups中的建议在UNIX中重新发布) 简短的问题是,如果外壳程序位于不拥有tty的孤立进程组中,它应该怎么办?但我建议阅读冗长的问题,因为这很有趣。 这是一种有趣且令人兴奋的方法,可以使用您喜欢的外壳将笔记本电脑变成便携式太空加热器(除非您是那些tcsh怪人之一): #include <unistd.h> int main(void) { if (fork() == 0) { execl("/bin/bash", "/bin/bash", NULL); } return 0; } 这导致bash将CPU固定在100%。zsh和fish的作用相同,而ksh和tcsh则对工作控制含糊其辞,然后再进行龙骨化处理,这虽然好一些,但效果不明显。哦,这是与平台无关的违规者:OS X和Linux都受影响。 我的解释(可能是错误的)如下:子外壳检测到它不在前台:tcgetpgrp(0) != getpgrp()。因此,它试图停止自身:killpg(getpgrp(), SIGTTIN)。但是它的进程组是孤立的,因为它的父级(C程序)是领导者并死亡,并且SIGTTIN发送给孤立进程组的操作只是被丢弃(否则什么也无法再次启动它)。因此,子外壳并没有停止,但是它仍然在后台,因此马上就可以再次执行所有操作。冲洗并重复。 我的问题是,命令行外壳程序如何检测到这种情况?正确的做法是什么?我有两个解决方案,都不是理想的: 尝试通知其pid与我们的组ID匹配的进程。如果使用失败ESRCH,则表明我们很可能成为孤儿。 尝试从中无阻塞读取一个字节/dev/tty。如果使用失败EIO,则表明我们很可能成为孤儿。 (我们跟踪此问题的是https://github.com/fish-shell/fish-shell/issues/422) 感谢您的想法!

1
恢复删除的文件保持由Apache打开?
假设一个apache日志文件被删除,但是由apache保持打开状态;然后这就是我在做什么: pid=$(lsof | grep text.txt | awk '/deleted/ {print $2}') fd=$(lsof | grep text.txt | awk '/deleted/ {print $4}' | grep -oE "[[:digit:]]{1,}") cp /proc/$pid/fd/$fd directorytobecopied/testfile.txt 这就是我要恢复的文件并将其放回原处的方式。有没有更简单的方法可以执行此操作,因为上面的代码看起来不太好。此外,我怎么知道从哪里删除文件(directorytobecopied),这样我就不必手动询问某人文件的原始位置并将其放回原处。


1
您如何为es设置环境?
最近几天我一直在玩es,它(如rc)具有一个怪癖/功能,即它仅.esrc在登录时运行其启动脚本()。在每个交互式会话中运行代码的通常方法是将该代码放入%prompt函数中。 当然,%prompt如果es -l从未运行过,则没有任何功能。 那么,问题来了:当您通过gdm或类似资源(仅源.profile(或.xprofile,.xsession等))进入时,如何设置登录环境?我想出的最好的是: if [ -f "$HOME/.esrc" ]; then eval "`es -l <<-x sh <<<'export -p' x`" fi 这似乎令人震惊。有更好的方法吗?

2
如何自动设置特定文件的可执行位
我希望当我创建一个特定文件时,假设我是在vim编辑器中创建的,创建的文件在创建时也应获得可执行权限。我想要这个,因为我正在创建一些python文件,并且不想显式设置该文件的权限,因此我想要某种方式,以便在我创建具有特定扩展名或特定编辑器的文件时立即设置可执行位。
10 shell  vim  editors 

3
从bash脚本自动化文本输入而无需使用EOF
我正在运行Ubuntu Linux。假设有一个名为的程序myprogram。该程序提示用户输入;特别是,用户必须在出现提示时键入一个整数,然后按Enter。我想使用bash脚本自动执行此过程。特别是,我想执行myprogram100次(使用i从1到的计数器100)。在每次执行时myprogram,我想i在出现提示时输入的当前值。 (顺便说一句,使用myprogramoptions / switches -options,它们都是常量,因此在bash脚本中指定。) 此bash脚本的不完整骨架可能是: #!/bin/bash for i in {1..100} do myprogram -options done 现在,我想修改上面的代码,以便i在程序提示时输入的当前值。做这个的最好方式是什么? 我正在使用的软件的网站建议<<EOF在行尾使用myprogram -options。我认为这告诉bash查看输入的“文件结尾”。但是,如果我不想要的东西放置在输入的结束文件?如果要在<<或之后立即放置<怎么办? 原因是事情会变得更加复杂。例如,我可能会引入一个j以某种非线性,非顺序方式改变的整数计数器。然后,我想在每次迭代中提供jto 的当前值myprogram,但是to 的值j可能在to的调用myprogram -options与文件的结尾之间变化EOF。 你有什么建议吗?

3
我如何cd到上一个/下一个兄弟目录?
我经常有这样的项目目录布局 project `-- component-a | `-- files... `-- component-b | `-- files... `-- component-c `-- files... 我通常将在其中一个component目录中工作,因为这是文件所在的位置。然后,当我返回外壳程序时,通常只需要移至同级目录,尤其是当我需要对每个组件进行一些不可编写脚本的更改时。在这些情况下,我什至都不关心我将要使用的上一个兄弟目录或下一个兄弟目录。 我可以定义一个命令prev还是next将其简单cd地带入上一个目录或下一个目录(按字母或其他字母)?因为cd ../com<TAB><Arrow keys>一直以来打字都有些陈旧。

2
连接STDOUT和STDIN是什么意思?
我正在读一本书,上面写着: 每个过程至少具有三个可用的通信通道:“标准输入”(STDIN),“标准输出”(STDOUT)和“标准错误”(STDERR)。 大多数命令接受来自STDIN的输入,并将其输出写入STDOUT。他们将错误消息写入STDERR。该约定使您可以像构建模块一样将命令串在一起以创建复合管道。 Shell将符号<,>和解释>>为将命令的输入或输出重新路由到文件或从文件重新路由的指令。 要将一个命令的STDOUT连接到另一个命令的STDIN,请使用| 通常称为管道的符号。 ps -ef | grep httpd 因此,基本上说的是,标准输入是允许用户写入文件的命令,而标准输出是具有bash shell将输出写入到shell的命令,而标准错误就像输出,但仅文件系统出错时调用。然后我们进入连接STDOUT和STDIN的部分,我迷路了。

2
在zsh中列出带有空格的元素
在这一点上,我已经学习了2个小时的所有zsh脚本,并且碰壁了。我想查看其中可能包含空格的文件列表。我愿意接受与以下示例完全不同的方法,只要它们是zsh,因为zsh是我正在研究的内容,而不是我要编写的任务。 files=(`ls`) for f in $files; do print $f done 我显然不只是在重新创建ls,我只是想$f在循环的每次迭代中捕获整个文件名。
10 shell  scripting  zsh 

2
通过“如果”将任务发送到后台
为什么是这样? if true; then sleep 3 &; fi bash: syntax error near unexpected token `;' 我要跑步 sleep 3 在后台运行,以便命令[“ sleep 3”仅作为示例]将以“ paralell”样式运行,因此完成速度更快。但是我得到这个: bash: syntax error near unexpected token `;' 错误信息。为什么?为什么我不能将任务发送到后台?

6
查找索引节点编号的便携式方法
最初,我使用stat -c %i file(以帮助检测是否存在监牢),它似乎可以在阳光下的任何Linux发行版上运行。在OS X上,我必须使用ls -i file | cut -d ' ' -f 1。 是否有某种方法可以在可跨* nix平台移植且不依赖于反复无常的shell脚本中查找文件的inode编号ls?
10 shell  inode 


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.