Questions tagged «shell-script»

有关shell脚本,由shell解释的可执行文件(bash,zsh等)的问题。

3
从函数内部执行邮件命令会导致“叉子炸弹”
当我尝试mail从bash脚本中的函数内部执行时,它会创建类似于fork炸弹的内容。为了澄清,这会引起问题: #!/bin/bash mail() { echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org" } mail exit 0 有时您只需要杀死该命令,它就会杀死子进程,但是有时您必须这样做killall -9。 不管邮件是否已发送。该叉炸弹创建两种方式。而且似乎没有为退出代码添加任何检查,例如if ! [ "$?" = 0 ]帮助。 但是以下脚本可以按预期工作,要么输出错误,要么发送邮件。 #!/bin/bash echo "Free of oxens" | mail -s "Do you want to play chicken with …

3
提取三个单引号之间的文本
我的档案中有以下内容 description: ''' This rule forbids throwing string literals or interpolations. While JavaScript (and CoffeeScript by extension) allow any expression to be thrown, it is best to only throw <a href="https://developer.mozilla.org /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects, because they contain valuable debugging information like the stack trace. Because of JavaScript's dynamic nature, CoffeeLint …

1
Bash脚本解析带引号的参数
请考虑这个名为test的简单脚本: #!/bin/bash echo $1 以及以下命令和调用: $ echo "A B" A B $ echo ""A B"" A B $ echo """A B""" A B $ echo """A B""" A B $ ./test "A B" A B $ ./test ""A B"" A $ ./test """A B""" A B $ ./test """"A B"""" …

3
有没有办法在脚本中即时获取加密的(GPG)文件?
我需要一个bash脚本来获取加密的文件,因为要获取的文件包含敏感信息。 我希望脚本提示输入GPG密码,然后运行,以获取加密文件。我虽然不知道该怎么做。密码必须有用户输入,因为我不想将带有加密文件的密钥存储在服务器上。 考虑一些不同的方法,我不想解密文件,获取未加密的文件,然后再将其删除。如果脚本出现问题,我想减少留下未加密文件的机会。 有没有一种方法可以获取文件的GPG输出以这种方式获取源代码?可能收集STDOUT并进行解析(如果GPG甚至可以这种方式输出内容)。 另外,如果还有其他方法可以加密Shell脚本可以使用的文件,我也不知道,但是有其他可能。

5
如何以编程方式检测awk风味(例如gawk vs nawk)
我使用的命令行应用程序实质上是bash shell脚本的集合。该应用程序被编写为可以在BSD / OSX和Linux上运行。其中一个脚本依赖于awk。它包含两个awk命令:一个是为nawk编写的(标准BSD awk实现),另一个是为gawk编写的(GNU awk实现)。 有问题的两个awk命令与不同的环境不兼容。特别是当与gawk一起运行时,nawk命令失败。该脚本检查内核名称(即uname -s)以确定主机环境,然后运行适当的awk命令。但是,我更喜欢在安装了GNU核心实用程序的Mac OS X上工作,因此脚本无法正确运行。 在思考如何最好地修复此错误的过程中,我想到,很高兴知道如何以编程方式区分常见命令行实用程序的不同样式,最好以相对健壮和可移植的方式进行区分。 我注意到nawk不接受'-V'标志来打印版本信息,因此我认为应该执行以下操作: awk -V &>/dev/null && echo gawk || echo nawk 另一个变化可能是: awk -Wversion &>/dev/null && echo gawk || echo nawk 这似乎适用于我的两个测试环境(OS X和CentOS)。这是我的问题: 这是最好的方法吗? 有没有一种方法可以扩展它以处理awk的其他变体(例如,awkk,jawk等)? 甚至值得担心其他版本的awk吗? 我还应该提到我对awk知之甚少。

3
awk没有结束
我在名为的文件中包含以下代码awktest1.awk: #!/bin/awk -f BEGIN{print "start"} {print $2, "\t", $5} END{print "end"} employee.txt 其中employee.txt包含以下数据: 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000 我将awk命令运行为: awk -f awktest1.awk 但它只是打印start而不会结束。有人可以帮我解决我在这里做错的事情吗?


6
测试后如何保持上次退出状态
测试后是否可以保持最后的命令退出状态($?)不变? 例如,我想做: command -p sudo ... [ $? -ne 1 ] && exit $? 最后一个exit $?应返回sudo退出状态,但始终返回0(测试的退出代码)。 没有临时变量,是否可以这样做? 另一个示例进一步说明: spd-say "$@" [ $? -ne 127 ] && exit $? 在这种情况下,我只想找到第一个命令(退出代码!= 127)就退出。而且我想用实际的spd-say退出代码退出(可能不是 0)。 编辑:我忘了提一下,我更喜欢POSIX投诉解决方案以获得更好的可移植性。 我在脚本中使用此结构,在脚本中我想为同一命令提供替代方法。例如,请参阅我的crc32脚本。 临时变量的问题在于它们可能会遮盖其他变量,并避免必须使用长名称,这不利于代码的可读性。

2
一个bash文件中有多个shebang
我有一个别人看过的脚本(注意:这是一个文件): #!/bin/bash some commands some commands #!/bin/bash some commands some commands #!/bin/bash some commands some commands 我想知道第二和第三次爆炸的目的是什么?是由于错误还是故意?

1
我可以更改选择选项的显示方式吗?
我正在使用bash中的select和case。我目前有9个选项,可以很好地整理整齐的3x3网格选项,但显示如下: 1) show all elements 4) write to file 7) clear elements 2) add elements 5) generate lines 8) choose file 3) load file 6) clear file 9) exit 我希望它显示在列之前的行中: 1) show all elements 2) add elements 3) load file 4) write to file 5) generate lines 6) clear file …


4
分割不同命令的输入并合并结果
我知道如何合并不同命令的结果 paste -t',' <(commanda) <(commandb) 我知道将相同的输入传递给不同的命令 cat myfile | tee >(commanda) >(commandb) 现在如何结合这些命令?这样我就可以 cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb 说我有一个文件 myfile: 1 2 3 4 我想制作一个新文件 1 4 2 2 3 4 3 2 6 4 1 8 我用了 cat myfile | tee >(tac) >(awk …

4
展平文件夹结构
我有这个文件夹结构: ├── foo1 │ ├── bar1.txt │ └── bar2.txt ├── foo2 │ ├── bar3.txt │ └── bar4 with a space.txt └── foo3 └── qux1 ├── bar5.txt └── bar6.txt 我想在每个文件夹级别之间加一个下划线: ├── foo1_bar1.txt ├── foo1_bar2.txt ├── foo2_bar3.txt ├── foo2_bar4 with a space.txt ├── foo3_qux1.bar6.txt └── foo3_qux1_bar5.txt 我四处张望,没有找到任何可行的解决方案,主要是因为我的问题有两个特殊之处:根目录中可能存在多个文件夹级别,而且某些文件可能包含空格。 任何想法如何在bash中完成此操作?谢谢! 编辑:运行格连杰克曼建议答案我得到这个: 一级文件夹有两个下划线。知道如何避免这种情况或只是对其重命名,以便仅使用一个下划线吗?谢谢。

5
哪些命令将输入​​制表符分隔的文本文件,并将每行削减为80个字符?
我有(有时)制表符分隔的数据的多行文本文件。我想输出文件,以便我可以浏览它-所以我只希望看到每行的前80个字符(我设计了文本文件,将重要内容放在每行的第一位)。 我以为我可以用cat读取文件的每一行,并将每一行发送到管道中的下一个命令: cat tabfile | cut -c -80 但这似乎是坏事。我试着胡闹,grep似乎可以工作-但后来我发现,不行(不是文件中的每一行都包含80多个字符)-看来,制表符被切为单个字符。 我试过了: cat tabfile | tr \t \040 | cut -c -80 通过消除空白可读性,即使那样会使我的数据有些混乱。但这没有用。都没有: cat tabfile | tr \011 \040 | cut -c -80 也许我使用的tr错误?我以前在tr上遇到过麻烦,想删除多个空格(似乎我在这台机器上可以访问的tr的版本有一个-s选项,用于压缩多个字符-我可能需要更多地使用它) 我确定如果弄乱了我可以使用perl,awk或sed或其他方法来执行此操作。 但是,我想要一个使用(POSIX?)常规命令的解决方案,以使其尽可能地可移植。如果最终使用tr,则可能最终会尝试将制表符转换为字符,也许要进行计算,削减计算量,然后将这些字符转换回制表符以进行输出。 它不必是一行,也不需要直接在命令行中输入-脚本就可以了。 关于选项卡文件的更多信息: 我使用制表符来中断字段,因为有一天我可能想将数据导入其他程序。所以我倾向于在内容之间只有一个选项卡。但是我也使用制表符将内容与垂直列对齐,以帮助查看纯文本文件时提高可读性。这意味着对于某些文本,我会在内容的末尾用空格填充,直到到达选项卡将使下一个字段与上下两个字段对齐的位置为止。 DarkTurquoise#00CED1海洋,天空,划艇自然 MediumSpringGreen#00FA9A对树魔术有用 青柠#00FF00仅用于春鸡和果肉

1
重击变量$ {0 ## * /}
我试图了解${0##*/}我在bash脚本中遇到的变量。 我知道其中$0包含脚本的名称或路径,然后##按${parameter##pattern}(source)中的方式工作。 但是我不明白/这里在做什么。我只知道这种带有两个斜杠的语法:${parameter/pat/string} 当我在bash中回显此变量时,我得到了bash:) 最后,我没有共享脚本的权限。我只说变量被调用SOFT="${0##*/}"并在printf语句中使用"Error message sent by $SOFT"

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.