Questions tagged «shell-script»

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

4
如何打开终端,拆分为9个终端并使用一个脚本在它们之间切换?
我想打开一个终端,将其拆分成可以说的9个部分(3x3),然后执行一些bash脚本。但是对于每个终端部分,不同的脚本。 可以使用perl,python甚至bash来完成吗? 如何在不使用键盘快捷键的情况下在这些小终端之间切换? 哦,顺便说一句,我正在使用terminator。如果还有其他支持这种功能的终端仿真器,那是什么?

3
如果条件出现括号,为什么没有空格时出现语法错误?
我使用下面的脚本将脚本从一年的开始两天开始运行时向后移动两天,并且还检查每个月的第一天和第二天并向后移动两天。 if [$month="01"] && [$day="01"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [$month="01"] && [$day="02"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [ $day = "01" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else if [ $day = "02" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else date="$month/$yes_day/$year" fulldate="$year$month$yes_day" fi fi fi fi 但我不好得到以下错误消息 Etime_script.sh: line 19: [06=01]: command not …

1
调试脚本,-x设置-euxo pipefail有什么区别?
我知道的调试脚本的主要方法是添加-x到shabang(#!/bin/bash -x)中。 我最近遇到了一种新方法,set -euxo pipefail在shabang的下面添加了一个新方法,如下所示: #!/bin/bash set -euxo pipefail 两种调试方式的主要区别是什么?有没有时间您会优先选择另一个? 作为一个新生,在这里阅读之后,我无法得出这样的结论。


3
如何去除目录路径的最后斜杠?
我有一个脚本,它需要一个目录作为一个参数。我想支持两种形式:一种是 a/b/c (最后没有斜杠),另一个就像 a/b/c/ (末尾有斜线)。 我的问题:给定两种形式中的任一种,我如何才能保持第一种形式不变并去除第二种形式的最后一个斜杠以将其转换为第一种形式。

3
采购Bash脚本-返回错误,而不是退出?
我正在终端中采购bash脚本,因此出现错误时退出 set -o errexit 杀死我的终端,这是非常烦人的,因为我必须关闭终端,再打开另一个终端,并重置一些变量。 到目前为止,使用 command || return 脚本中的行完全按照我想要的做 set -o errexit 要做...但是我希望整个脚本都完成;不只是一行/命令 我有一个完整的命令文件来设置站点,我宁愿不执行命令||。返回 对于文件中的每一行 是否还有另一个设置选项,或者只是“返回”而不退出终端的其他选项? - 为了清楚起见,我想终止脚本,并使终端保持与按ctrl + C终止在终端中运行的服务相同的状态。command || return做到这一点。但我不想继续|| return处理文件中的每一行。所以我正在寻找与相似的东西set -o errexit,但不会导致终端关闭 ---注意: 创建一个包含两行的哑脚本(super.sh): create_path=~/Desktop/site_builder/create.sh source $create_path blah 然后放在set -o errexitcreate.sh的顶部, 完全按照我的预期工作。但是,必须创建一个包含两行的文件,只是调用另一个bash脚本,而不是仅仅从终端调用它,这确实很愚蠢。g 这里有一些例子: 在super.sh中 #!/bin/bash create_path=~/Desktop/site_builder/create.sh source $create_path blah 在create.sh中 #!/bin/bash set -o errexit #line below …


4
如何列出所有用户名和/或主目录?
我要列出计算机上的所有用户目录。通常,我会这样做: ls -l /home 但是我在一个脚本中使用它,该脚本将部署在其他计算机上,也许会在他们不称其为Home的计算机上(例如myHome)。所以我想将其概括为ls -l ~。但这只是列出我的用户家庭目录,而不是列出所有用户家庭目录名称(基本上,我想在计算机上获取用户名称的列表)。我该如何概括呢?

6
脚本启动后选择解释器,例如if / else在hashbang中
有没有办法动态选择正在执行脚本的解释器?我有一个在两个不同系统上运行的脚本,并且我要使用的解释器位于两个系统上的不同位置。我最终必须要做的是每次切换时都更改hashbang行。我愿做一些事情,是合乎逻辑的该等效(我知道这个确切的结构是不可能的): if running on system A: #!/path/to/python/on/systemA elif running on system B: #!/path/on/systemB #Rest of script goes here 甚至更好的是,它尝试使用第一个解释器,如果找不到,则使用第二个: try: #!/path/to/python/on/systemA except: #!path/on/systemB #Rest of script goes here 很显然,我可以代替执行它 /path/to/python/on/systemA myscript.py 还是 /path/on/systemB myscript.py 取决于我在哪里,但我其实有一个包装脚本启动myscript.py,所以我想以指定Python解释器编程而不是手工的路径。

1
消除音频文件中的静音,同时留出空隙
当前,我们在外壳程序脚本中使用此命令来消除音频文件的静音: ffmpeg -i $INFILE -af silenceremove=0:0:0:-1:1:${NOISE_TOLERANCE}dB -ac 1 $SILENCED_FILE -y 效果很好,除了它消除了所有的静音,使其余的音频被压缩在一起。 如何在每段音频之间留出两到三秒钟的同时完成此操作? 该解决方案必须非常高效,因为我们将处理大量音频,并应使用可以很容易安装在Linux和OSX上的工具,例如ffmpeg或sox。

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

5
快速压缩大量大文件
我每天产生约200 GB的日志数据,分布在约150个不同的日志文件中。 我有一个脚本将文件移动到临时位置,并在临时目录上执行tar-bz2。 将200 GB的日志压缩到大约12-15 GB后,我得到了很好的结果。 问题是压缩文件需要花费很多时间。该cron的工作上午2:30每天运行,并继续运行,直到5:00-6:00 PM。 有没有办法提高压缩速度并更快地完成工作?有任何想法吗? 不用担心其他所有过程,压缩发生的位置在NAS上,我可以在专用VM上运行将NAS挂载,然后从那里运行压缩脚本。 这是top的输出,以供参考: top - 15:53:50 up 1093 days, 6:36, 1 user, load average: 1.00, 1.05, 1.07 Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie Cpu(s): 25.1%us, 0.7%sy, 0.0%ni, 74.1%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st Mem: 8388608k total, 8334844k used, …

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 …

4
比较不同文件的两列并打印是否匹配
我正在使用Solaris 10,因此涉及-f的grep选项不起作用。 我有两个管道分隔的文件: 文件1: abc|123|BNY|apple| cab|234|cyx|orange| def|kumar|pki|bird| 文件2: abc|123| kumar|pki| cab|234 我想将file2的前两列与file1进行比较(在前两列中搜索file1的全部内容),如果它们匹配,则打印出file1的匹配行。然后搜索文件2的第二行,依此类推。 预期产量: abc|123|BNY|apple| cab|234|cyx|orange| 我的文件很大,包含大约40万行,因此我想加快执行速度。

4
如果密钥已经在那里,请让ssh-add安静
我想放在ssh-add /path/to/special_key脚本的顶部。这可以正常工作,但始终提示您输入密码。这很奇怪,有点令人讨厌,因为即使ssh-add -l显示密钥已经被添加,它仍然要求输入密码。 有没有办法告诉它:“添加此密钥并询问密码是否还没有添加,否则什么也不做”?

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.