Questions tagged «scripting»

脚本是由解释程序执行而不是编译为独立可执行程序的命令或指令序列。

2
什么时候编写可移植脚本很重要?
我写的大多数代码都在PHP中。我最近开始学习Shell脚本。我遇到的大多数资源和教程都是针对Bash的。有些警告关于洗礼,有些则没有。我在这里和Stack Overflow上已经读了很多东西。 每当答案使用Bashisms时,不可避免地会有人评论说: 您不应该使用<在此处插入bashism>。它不是便携式的。 即使将问题标记为,也会发生这种情况bash。对我来说,这就像告诉一个PHP程序员,他们不应该使用PHP 5中的新代码,因为它不能与PHP 4一起使用。或者告诉某人,他们不应该为Mac写一些东西,因为它不能被使用。在Windows上。 当我用PHP编写时,我选择了最低要求,并编写了向前兼容的代码。我不担心使其向后兼容。 如果我使用#!/bin/bashshebang,为什么不使用bashisms?我开始得到的印象是有些人就是喜欢bash的 bash化(双关语意)只是为了它的缘故。 人们经常使用bash并且shell可以互换使用-可能是由于bash是许多系统上的默认shell。因此,我可以理解添加注释以警告该代码使用了bashisms,但我不明白使用它们的含义是错误的。 显然,如果我编写的脚本严格仅供个人使用,则可以用我想要的任何语言编写。但我想认为我编写的某些代码可能对其他人有用。 发布前,我尝试过寻找问题的答案。我发现了很多有关如何测试可移植性的信息,但是找不到什么时候进行此操作很重要。 那么,什么时候编写可移植脚本很重要? 例如, 哪种类型的脚本应尽可能地可移植? 没有安装Bash的系统有多普遍? 如果系统已安装Bash,它还会具有GNU版本的find和其他实用程序吗?

6
使用并行将唯一的输入文件处理为唯一的输出文件
我遇到了一个shell脚本问题,在该脚本中,我给了一个充满输入文件的目录(每个文件包含许多输入行),我需要单独处理它们,将它们的每个输出重定向到唯一文件(又名file_1.input需要)。在file_1.output中捕获,依此类推)。 Pre-parallel之前,我将遍历目录中的每个文件并执行我的命令,同时使用某种计时器/计数技术以免使处理器不堪重负(假设每个进程的运行时间恒定)。但是,我知道情况并非总是如此,因此使用类似“并行”的解决方案似乎是无需编写自定义代码即可获得Shell脚本多线程的最佳方法。 尽管我已经想到了一些方法来并行处理这些文件(并允许我高效地管理内核),但它们似乎都是很棘手的。我有一个非常简单的用例,因此希望尽可能保持整洁(并且并行示例中的任何内容似乎都不是我的问题。 任何帮助,将不胜感激! 输入目录示例: > ls -l input_files/ total 13355 location1.txt location2.txt location3.txt location4.txt location5.txt 脚本: > cat proces_script.sh #!/bin/sh customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile] 更新:阅读下面Ole的答案后,我能够将缺少的部分放到我自己的并行实现中。尽管他的回答很好,但以下是我的补充研究和记录: 我没有执行我的整个过程,而是从概念验证命令开始,以证明他在我的环境中的解决方案。请参阅我的两个不同的实现(和注释): find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out 使用find(不是ls,这可能会导致问题)在我的输入文件目录中找到所有适用的文件,然后将其内容重定向到单独的目录和文件。我上面的问题是阅读和重定向(实际脚本很简单),因此用cat替换脚本是一个很好的概念证明。 parallel cat '>' …



4
如何检索可能的ssh攻击者的IP地址?
我刚刚cat /var/log/auth.log登录并看到,有很多| grep "Failed password for"记录。 但是,有两种可能的记录类型-有效/无效用户。它使我的尝试变得复杂| cut他们的。 我想看到创建一个列表(文本文件),其中包含可能的攻击者的IP地址以及每个IP地址的尝试次数。有什么简单的方法可以创建它吗? 另外,仅涉及ssh:/var/log/auth.log在列出可能的攻击者时,我应该考虑所有记录吗? 我的带有隐藏数字的“ auth.log”示例: cat /var/log/auth.log | grep "Failed password for" | sed 's/[0-9]/1/g' | sort -u | tail 结果: Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user ucpss from 111.11.111.111 port 11111 ssh1 Mar 11 11:11:11 vm11111 sshd[111]: Failed …


4
两者完成后如何运行并行进程并合并输出
我有一个bash shell脚本,其中通过大约5或6个不同的程序将一些数据通过管道传输,然后将最终结果传输到制表符分隔的文件中。 然后,我对一个单独的相似数据集再次执行相同操作,然后输出到第二个文件。 然后将两个文件输入另一个程序进行比较分析。例如简化 Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv AnalysisProg -i Data1res.csv Data2res.csv 我的问题是:如何使step1和step2同时运行(例如,使用&),但在两者均完成时仅启动step3(AnalysisProg)? 谢谢 ps AnalysisProg在流或FIFO上不起作用。

4
一旦检测到静音,结束袜队记录
我正在编写一个脚本,该脚本使用sox记录我的讲话。现在,我需要sox来等待,直到它检测到声音,然后才开始录音,而我确实已经弄清楚了。但是一旦沉默至少3秒钟,我还需要sox 退出。就目前而言,一旦我结束交谈,我就必须手动杀死sox,否则sox会再次等到我再讲话,然后追加到输出文件中(那不是我想要的)。这是我现在正在使用的录制命令: rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% 同样,为了清楚起见,Sox应该等到我开始讲话之后再记录,直到我停止讲话,然后sox程序应该退出。
16 scripting  audio  sox 

1
使用rsync输出的“对话框”制作进度条
我正在寻找一种过滤/重定向rsync输出的方式,可以将其输入到“ dialog --gauge”命令中,以便在文件同步过程中获得一个漂亮的进度条。目前,我仅在提示符下直接对其进行了测试,但我计划在(bash)shell脚本中进行此操作。 我环顾了互联网,发现了点点滴滴,但我仍然缺少使它正常工作的东西 (免责声明:这可能是完全错误的方法,并且是重定向/管道怪诞) 我目前汇总的内容: rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 首先,我有一个带有--progress选项的实际rsync命令。rsync的输出通过管道传递到awk中,并使用以下awk过滤器: { if (index($0, "to-check=") > 0) { split($0, pieces, "to-check=") split(pieces[2], term, ")"); split(term[1], division, …
16 linux  bash  scripting  awk  rsync 



5
在剧本的shebang行中,我怎么可能有不止一种可能性?
我处于一个有趣的情况,我有一个Python脚本,理论上可以由具有各种环境(和PATH)的各种用户以及各种Linux系统上运行。我希望此脚本在尽可能多的可执行文件上不受人为限制。以下是一些已知的设置: Python 2.6是系统Python版本,因此python,python2和python2.6都存在于/ usr / bin中(并且是等效的)。 如上所述,Python 2.6是系统Python版本,但Python 2.7与python2.7一同安装。 Python 2.4是系统Python版本,我的脚本不支持该版本。在/ usr / bin中,我们有等效的python,python2和python2.4,以及脚本支持的python2.5。 我想对所有这三个脚本运行相同的可执行python脚本。如果它先尝试使用/usr/bin/python2.7(如果存在),然后回退至/usr/bin/python2.6,然后回退至/usr/bin/python2.5,然后再回退,那就太好了如果这些都不存在,就简单地将错误提示出来。不过,我不太可能使用最新的2.x,只要它能够找到正确的解释器之一(如果存在)。 我的第一个倾向是将shebang线从以下位置更改: #!/usr/bin/python 至 #!/usr/bin/python2.[5-7] 因为这在bash中效果很好。但是运行脚本可以得到: /usr/bin/python2.[5-7]: bad interpreter: No such file or directory 好的,所以我尝试以下方法,它也可以在bash中使用: #!/bin/bash -c /usr/bin/python2.[5-7] 但是,再次失败: /bin/bash: - : invalid option 好的,显然我可以编写一个单独的shell脚本来找到正确的解释器,并使用找到的任何解释器运行python脚本。我会发现分发两个文件很麻烦,只要在安装了最新的python 2解释器的情况下运行一个文件就足够了。要求人们明确地调用解释器(例如$ python2.5 script.py)不是一种选择。也不能选择依靠用户的PATH进行某种设置。 编辑: 版本的Python脚本内检查是不是因为我用它存在像Python 2.6的(并可以在2.5与所使用的“与”语句去上班from __future__ import with_statement)。这会导致脚本立即失败,并出现用户不友好的SyntaxError,并阻止我有机会先检查版本并发出适当的错误。 示例:(使用小于2.6的Python解释器尝试此操作) #!/usr/bin/env …
16 bash  scripting  python 

4
用sed处理bash变量
bash变量LATLNG像这样在方括号中包含纬度和经度值 (53.3096,-6.28396) 我想将它们解析成一个名为LAT和LON的变量,我正试图通过sed像这样 LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG") LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG") 但是,出现以下错误: sed: can't read (53.3096,-6.28396): No such file or directory

8
Linux Shell脚本:仅在程序存在时运行,如果不存在则将其忽略
我编程一个Linux的shell脚本,将只有在合适的工具,比如它的执行过程中打印状态横幅figlet,被安装(是这样的:到达系统的路径)。 例: #!/usr/bin/env bash echo "foo" figlet "Starting" echo "moo" figlet "Working" echo "foo moo" figlet "Finished" 我想为我的脚本工作无差错,即使figlet在没有安装。 什么是实用的方法?

3
从脚本语言调用Linux系统调用
我想直接从脚本语言调用Linux syscall(或至少是libc包装器)。我不在乎什么脚本语言-不编译它是很重要的(原因基本上与在依赖路径中不希望使用编译器有关,但这不在这里或那里)。是否有任何脚本语言(shell,Python,Ruby等)允许这样做? 特别是,它是getrandom系统调用。

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.