标签: scripting

如何制作将输出发送到进程的 shell 脚本

我目前正在屏幕上运行服务器控制台程序,因为我需要阅读它并偶尔发送命令。

我想在后台将应用程序作为守护程序运行(使用 init 启动/停止它)。

我可以tail -f记录日志,但这不会让我向进程发送输入。

有什么方法可以设置它以便我可以读取和发送输入,但仍然让它在后台运行?

我还希望能够将来自不同进程的输入发送到守护程序(例如,可以发送“停止\n”命令的 shell 脚本)。

scripting shell-script tail

11
推荐指数
1
解决办法
4132
查看次数

压缩文件时排除目录

我有一个 bash 脚本,它执行如下操作:

zip -0 ../backup/backup.zip \
-r ./* \
-x \*CVS\* \
-x *Thumbs.db* \
Run Code Online (Sandbox Code Playgroud)

它备份的目录是一个 SVN 归档文件(过去它曾经是 CVS)。我一直无法让它排除 .svn 及其内容。排除 .svn 的最干净方法是什么(递归遍历整个树)?

scripting bash zip

11
推荐指数
1
解决办法
2万
查看次数

循环输出管道防止局部变量修改

我正在尝试编写一个简单的 bash 函数,该函数将许多文件和/或目录作为其参数。这应该:

  1. 完全限定文件名。
  2. 对它们进行排序。
  3. 删除重复项。
  4. 打印所有实际存在的内容。
  5. 返回不存在的文件数。

我有一个脚本,几乎可以满足我的要求,但是排序失败了。脚本的返回值是正确的,但输出不是(未排序和重复)。如果我| sort -u按照指示取消注释该语句,则输出是正确的,但返回值始终为0.

NB 解决问题的更简单的解决方案是受欢迎的,但问题实际上是关于为什么我的代码中会发生这种情况。也就是说,为什么添加管道似乎会阻止脚本增加变量r

这是脚本:

function uniqfile
{
    local r=0 

    for arg in "$@"
    do  
        readlink -e "$arg" || (( ++r ))

    done #| sort -u    ## remove that comment

    return $r
}
Run Code Online (Sandbox Code Playgroud)

shell scripting bash pipe shell-script

11
推荐指数
1
解决办法
5093
查看次数

python == python2 或 python == python3 ?如何打包、分发python py2k脚本?

取决于系统,python==python2python== python3

可执行的 Python 脚本,以:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...
Run Code Online (Sandbox Code Playgroud)

对于 python py3k,它在文档中提供,我应该/可以将它与版本号一起使用,所以我这样做:

#!/usr/bin/env python3
Run Code Online (Sandbox Code Playgroud)

但是我发现 py2k 脚本有问题。

py2k 文档中,它被编写为使用 : #! /usr/bin/env python,

在某些 *nix-es python py3k 是默认的,所以 python==python3. (例如ArchLinux python 包,这里是python 包文件)。

如何打包(配置、制作)和/或准备用于分发的 Python 脚本来处理它?

我问的是如何制作用户可以轻松运行的软件包(无需修改他们的环境)

我可以对 python py2k 脚本执行与 python py3k 脚本相同的技巧并将其设置为 :#!/usr/bin/env python2吗?我可以确定每个 python py2k 发行版都包含python2文件,所以#!/usr/bin/env python2会起作用吗?

如果是,为什么不建议将其作为标准,例如在python py2k 文档中

scripting packaging compatibility python

11
推荐指数
1
解决办法
2674
查看次数

使用 stat 为触摸提供时间戳

我正在尝试对一些文档进行 OCR 原位(从 Windows 共享上的 linux 命令行)。OCRing 的过程是 find ,我已经使用 find 命令正确地通过循环管道传输文件。

但是我需要保留原始时间戳以进行修改。我目前正在尝试使用 stat 和 touch 如下:

#!/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
Run Code Online (Sandbox Code Playgroud)

当然 touch 命令失败了。单独运行命令我注意到“stat -c”是这样的:

1334758696

这就像我不知道的日期。我觉得我很接近,但无法弄清楚如何将我拥有的日期转换为触摸友好版本。它是某种形式的秒数吗?

scripting bash stat

11
推荐指数
2
解决办法
1万
查看次数

你如何只为 bash 脚本着色一些关键字?

我正在运行一些单元测试代码。单元测试代码输出常规文本。有很多文本,所以我想为用户突出显示重要的关键字。

在这种情况下,关键字是“通过”和“失败”。

你如何将“通过”着色为绿色,将“失败”着色为红色?

colors scripting bash shell-script

11
推荐指数
2
解决办法
2万
查看次数

进程卡住时跳出

我编写了一个循环来迭代所有.outc 二进制文件并将它们的输出复制到一个文本文件中(每个二进制文件的输出只是一行哈希值,一个程序的一行输出)。到目前为止,这是我的代码:

for j in {1..10}
do
    ./gcc-$j.out >> gcc-result.txt
done
Run Code Online (Sandbox Code Playgroud)

不幸的是,一些二进制文件存在一些未知问题,无法正确执行(它们卡住了,无法继续执行下一个程序)。

我不打算修复那些 c 代码,但我希望我的 bash 在给定的超时(比如 10 秒)内自动跳转到执行下一个程序,并将“0”写入gcc-result.txt.

如果您有解决此问题的想法,请提前致谢。

scripting bash

10
推荐指数
1
解决办法
1592
查看次数

while 读循环

我有一个像下面这样的文件

var     3   2014   string
var1    4   2011   string4
var2    6   1999   string2
var3    1   2016   string6
Run Code Online (Sandbox Code Playgroud)

然后我有这个 while read 循环来将其中一列与一个数字进行比较,然后回显一些东西。然而,它没有回应我想要的短语,而是回应了别的东西。

while read num
do
if [ "$num" = "0" ]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done < home/dir/file.txt | awk '{print $2}' 
Run Code Online (Sandbox Code Playgroud)

它不是回应上述内容,而是回应文件的第二列。

scripting ksh shell-script

10
推荐指数
3
解决办法
6万
查看次数

我怎样才能制作一个以五为单位计数的脚本?

我试图制作一个非常简单的 bash 脚本来列出 375 和 3500(375、380、385...)之间的所有 5 的倍数。我尝试过但没有用的一件事是:

for i in {375..3500}
do
        echo $i
        (($i += 5))
done
Run Code Online (Sandbox Code Playgroud)

过了一会儿我放弃了,在大约 15 秒内用 BASIC 写了这个:

10 count = 375
20 print count
30 count = count+5
40 if count < 3500 then goto 20
Run Code Online (Sandbox Code Playgroud)

如何在 bash 脚本中制作我的 BASIC 程序?

shell scripting bash

10
推荐指数
5
解决办法
6686
查看次数

Bash:计算两个时间戳之间经过的时间

我编写了一个脚本,当某个值不在给定范围内时会通知我。“超出范围”的所有值都记录在一组每日文件中。

每行都以专有的反向方式加时间戳:yyyymmddHHMMSS

现在,我想改进脚本,并在给定超出范围值的上次通知后至少过去 60 分钟时接收通知。

我已经解决了以相反顺序打印日志的问题:

for i in $(ls -t /var/log/logfolder/*); do zcat $i|tac|grep \!\!\!|grep --color KEYFORVALUE; done
Run Code Online (Sandbox Code Playgroud)

结果是:

...
20170817041001 - WARNING: KEYFORVALUE=252.36 is not between 225 and 245 (!!!)
20170817040001 - WARNING: KEYFORVALUE=254.35 is not between 225 and 245 (!!!)
20170817035001 - WARNING: KEYFORVALUE=254.55 is not between 225 and 245 (!!!)
20170817034001 - WARNING: KEYFORVALUE=254.58 is not between 225 and 245 (!!!)
20170817033001 - WARNING: KEYFORVALUE=255.32 is not between 225 and 245 (!!!)
20170817032001 - WARNING: KEYFORVALUE=254.99 …
Run Code Online (Sandbox Code Playgroud)

linux scripting bash shell-script timestamps

10
推荐指数
2
解决办法
4万
查看次数

标签 统计

scripting ×10

bash ×7

shell-script ×5

shell ×2

colors ×1

compatibility ×1

ksh ×1

linux ×1

packaging ×1

pipe ×1

python ×1

stat ×1

tail ×1

timestamps ×1

zip ×1