标签: bash-scripting

检测 bash 脚本中播放的音频

有没有办法检测是否有声音正在播放(使用 bash 脚本)?

(我在Ubuntu 11.10上使用pulseaudio。)

我计划在指示器中使用它来直观地提醒我静音打开时正在播放声音。

audio bash-scripting ubuntu-11.10

4
推荐指数
1
解决办法
4248
查看次数

如何将bash自动完成的结果作为字符串获取?

我正在寻找的不是如何在 bash 中为另一个程序添加自动完成功能,而是一种将 bash 中发生的事情的结果转换为字符串的方法,基本上:

autocomplete "/etc/apa"
Run Code Online (Sandbox Code Playgroud)

会回来

/etc/apache2/
Run Code Online (Sandbox Code Playgroud)

所以我可以在我的脚本中使用它。

非常感谢任何帮助,因为我能找到的只是如何使用“完整”的 bash 函数,它做了一些不同的事情;)

干杯,拉斐尔

bash command-line autocomplete bash-scripting

4
推荐指数
1
解决办法
735
查看次数

如果目录尚不存在,如何递归创建目录?

这似乎是一个通用实用程序,我想知道是否已经存在任何东西。我试图在脚本运行后将带时间戳的日志文件放在目录中,但需要先确保子目录(以及链中的任何目录)存在。

例如,如果完整的相对路径是./2014/Backups/Logfiles,我想检查是否2014不存在,创建它,如果Backups不存在,创建它,如果Logfiles不存在,创建它....

到目前为止,我已经得到了这样的东西(但这只是一步):LOGFILE_DIRECTORY="./2014/Backups/Logfiles"

if [ ! -d "$LOGFILE_DIRECTORY" ]; then
  mkdir "$LOGFILE_DIRECTORY" >> $LOGFILE 2>&1
fi
Run Code Online (Sandbox Code Playgroud)

编辑,添加解决方案

if [ ! -d "$LOGFILE_DIRECTORY" ]; then
  mkdir -p "$LOGFILE_DIRECTORY" >> $LOGFILE 2>&1
fi
Run Code Online (Sandbox Code Playgroud)

shell-script bash-scripting

4
推荐指数
1
解决办法
3068
查看次数

在选择 while 循环时更新 sqlite 数据库

有一个 bash 脚本将对引用 sqlite 数据库的文件执行“一些魔法”\xe2\x84\xa2,并且在执行“一些魔法”\xe2\x84\xa2 后,应该更新数据库。这是简化的代码

\n\n
sqlite3 database.db "select NUMBER from table WHERE STATUS = \'N\'" | while read line; do\n    SELECTION=$(echo $line | awk -F\'|\' \'{ print $1 }\')\n    [some magic]\xe2\x84\xa2\n    sqlite3 database.db "update table SET STATUS=\'Y\' WHERE NUMBER=\'$SELECTION\'"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切正常,sqlite 数据库将被逐行读取,我可以对引用的文件执行“一些魔法”\xe2\x84\xa2,但我可以\xc2\xb4t 更新数据库中的行 - I\xc2\xb4ve出现错误:

\n\n
\n

错误:数据库已锁定

\n
\n\n

有人知道我如何在读取数据库时更新数据库吗?或者还有其他解决方案可以让我做到这一点吗?

\n

script bash sqlite bash-scripting

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

对 jq 解析器感到困惑

我正在尝试在我的 bash 脚本中使用jq 解析器,但我对它的工作方式感到困惑,有人可以解释一下我做错了什么吗?

这是来自外部服务的原始文件,我需要从中获取value:

root@test ~ # cat test.json 
{"sensors":[{"id":34585,"value":-3.06,"time":1457031003}]}
Run Code Online (Sandbox Code Playgroud)

尝试将其发送至jq:

root@test ~ # cat narod.json | jq
{
  "sensors": [
    {
      "id": 34585,
      "value": -3.06,
      "time": 1457031003
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

试图获得sensors:

root@test ~ # cat narod.json | jq '.sensors'
[
  {
    "id": 34585,
    "value": -3.06,
    "time": 1457031003
  }
]
Run Code Online (Sandbox Code Playgroud)

试图value从sensors:

root@test ~ # cat narod.json | jq '.sensors.value'
jq: error (at <stdin>:0): Cannot index array with …
Run Code Online (Sandbox Code Playgroud)

bash bash-scripting

4
推荐指数
1
解决办法
7370
查看次数

是否有“watch”命令的本地替代方法;达尔文/OS X

我有一个脚本,我试图从 Linux 移植到 Darwin/OS X。Linux 版本目前依赖于 watch 命令,默认情况下它似乎没有安装在 Darwin/OS X 上。什么是原生替代品?

bsd compatibility bash-scripting macos

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

'while read' 循环遍历文本文件中的行,在 Bash 脚本中丢失字符。FFmpeg 线是罪魁祸首吗?

我正在使用“while read”循环浏览文本文件。我从每一行读取三个变量 - 两个文件名和一个十进制数。我知道这适用于普通设置(循环、读取行、回显行、提取变量,仅此而已),因为我已经在输入文件上对其进行了测试。

但是,一旦我添加了例程的内容,我就会得到一个奇怪的结果 - 这是对 ffmpeg 的调用以合并由文件名表示的音频和视频流。连续的“读取”操作会忽略行中的前导字符。我在这里读到在“while read”循环中调用“read”输入可能会导致问题,并想知道 ffmpeg 调用是否正在做一些混淆 bash 的事情,但这似乎不太可能而且很奇怪!注意:我不太了解 ffmpeg 调用 - 我是从另一个问题的答案中得到的。

任何帮助,将不胜感激!

第一个“读取”按预期工作(并且 ffmpeg 命令完成):

LINE  1
vidsNeedingSound/448£generic@06_10_16-09_30_47.mp4 soundToAdd/448£generic@06_10_16-12_11_54.wav 6.988354
V: vidsNeedingSound/448£generic@06_10_16-09_30_47.mp4   A: soundToAdd/448£generic@06_10_16-12_11_54.wav   D: 6.988354
Run Code Online (Sandbox Code Playgroud)

第二个“读取”从行首丢失 36 个字符(并且 ffmpeg 命令失败,因为由变量 V 表示的文件不指向文件,该文件取行的第一项):

LINE  2
6-09_30_47.mp4 soundToAdd/452£generic@06_10_16-12_11_54.wav 9.64663
V: 6-09_30_47.mp4   A: soundToAdd/452...
Run Code Online (Sandbox Code Playgroud)

第三个“读取”按预期工作(并且 ffmpeg 命令完成):

LINE  3
vidsNeedingSound/452£left@06_10_16-09_30_47.mp4 soundToAdd/452£left@06_10_16-12_11_54.wav 9.862118
V: vidsNeedingSound/452£left@06_10_16-09_30_47.mp4   A: soundToAdd/452...
Run Code Online (Sandbox Code Playgroud)

第四个“读取”从行首丢失 37 个字符(比最后一个失败多一个)(并且 ffmpeg 命令失败):

LINE  4
09_30_47.mp4 soundToAdd/452£right@06_10_16-12_11_54.wav 9.431392
V: 09_30_47.mp4   A: soundToAdd/452....
Run Code Online (Sandbox Code Playgroud)

这就是模式。如果之前没有成功调用 ffmpeg,则“读取”按预期工作。在每次连续成功的 ffmpeg …

linux ffmpeg bash-scripting

4
推荐指数
1
解决办法
1623
查看次数

从 cygwin 运行 Windows 命令

我可以通过 cygwin 运行 Windows 命令,并将参数传递给它吗?

具体来说,我想要一个运行 Robocopy 的 bash 脚本,但问题很普遍。

Robocopy 比 rsync 更适合我的需求,但批处理脚本是反复无常的。PowerShell 看起来很有趣,但如果可能的话,我宁愿不学习一门新语言,而且 bash 非常方便。

我找不到任何关于它的提及。

谢谢

windows script cygwin batch-file bash-scripting

4
推荐指数
1
解决办法
8632
查看次数

有没有办法在 bash 脚本中获取用户的 SSH 客户端 IP 地址?

由于应用程序限制,我有两个用户需要使用相同的登录名。

这些用户对 shell 提示应该是什么样子有很大的不同意见。其中一位甚至坚持要修改色觉。这导致了 .bashrc PS1 争议。我已经给了他们脚本来设置他们自己的偏好,但是......让我们说这很复杂。

幸运的是,它们都从具有已知 IP 地址的位置连接。有没有一种方法可以将用户的远程 IP 地址合并到一个条件中,从而为他们提供他们想要的东西,而无需任何额外的步骤?他们通过 ssh 连接。

bash bash-scripting

4
推荐指数
1
解决办法
989
查看次数

向现有 JSON 数组添加新元素

如何"arn:aws:iam::xxxxxxx:role/3"在下面添加一行,"arn:aws:iam::xxxxxxx:role/2"在"arn:aws:iam::xxxxxxx:role/2",之后添加一个逗号。

前:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxx:role/1",
          "arn:aws:iam::xxxxxxx:role/2"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

后

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxx:role/1",
          "arn:aws:iam::xxxxxxx:role/2",
          "arn:aws:iam::xxxxxxx:role/3"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

perl sed bash-scripting

4
推荐指数
1
解决办法
2824
查看次数