标签: shell-script

在单行 bash 循环中使用 &(与号)

我一直在成功使用此命令,它更改了配置文件中的变量,然后在循环中执行 Python 脚本:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt; python DoMyScript.py; done
Run Code Online (Sandbox Code Playgroud)

由于每个DoMyScript.py实例在终止前运行大约需要 30 秒,我想将它们降级到后台,同时可以生成下一个。

我已经尝试了我熟悉的方法,添加了一个&符号,如下所示:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt; python DoMyScript.py &; done
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

-bash: syntax error near unexpected token `;'
Run Code Online (Sandbox Code Playgroud)

command-line bash process shell-script

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

如何从文件的最后一行删除换行符以便向该行添加文本?

假设我有一个名为file

$ cat file
Hello
Welcome to
Unix
Run Code Online (Sandbox Code Playgroud)

我想and Linux在文件最后一行的末尾添加。如果我这样做echo " and Linux" >> file将被添加到一个新行。但我想要最后一行Unix and Linux

所以,为了解决这个问题,我想删除文件末尾的换行符。因此,如何删除文件末尾的换行符以便向该行添加文本?

shell-script text-processing newlines

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

用它们的实际值替换文件中的环境变量?

有没有一种简单的方法来替换/评估文件中的环境变量?假设我有一个config.xml包含以下内容的文件:

<property>
    <name>instanceId</name>
    <value>$INSTANCE_ID</value>
</property>
<property>
    <name>rootPath</name>
    <value>/services/$SERVICE_NAME</value>
</property>
Run Code Online (Sandbox Code Playgroud)

...等等。我想$INSTANCE_IDINSTANCE_ID环境变量的值替换文件$SERVICE_NAME中的SERVICE_NAMEenv var的值。我不会先验地知道需要哪些环境变量(或者,如果有人向配置文件添加了新的环境变量,我不想更新脚本)。谢谢!

scripting shell-script text-processing environment-variables

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

pdf中的分页

我有一个扫描的 PDF 文件,其中两个不同的真实页面一起出现在一个虚拟页面上。

分辨率质量很好。问题是我在阅读时必须缩放并从左向右拖动。
是否有一些命令 ( convert, pdftk, ...) 或脚本可以将此 pdf 文件转换为普通页面(书中的一页 = pdf 文件中的一页)?

command-line shell-script pdf conversion

76
推荐指数
7
解决办法
5万
查看次数

为什么要在函数中编写整个 bash 脚本?

在工作中,我经常编写 bash 脚本。我的主管建议将整个脚本分解为函数,类似于以下示例:

#!/bin/bash

# Configure variables
declare_variables() {
    noun=geese
    count=three
}

# Announce something
i_am_foo() {
    echo "I am foo"
    sleep 0.5
    echo "hear me roar!"
}

# Tell a joke
walk_into_bar() {
    echo "So these ${count} ${noun} walk into a bar..."
}

# Emulate a pendulum clock for a bit
do_baz() {
    for i in {1..6}; do
        expr $i % 2 >/dev/null && echo "tick" || echo "tock"
        sleep 1
    done
}

# Establish run order
main() { …
Run Code Online (Sandbox Code Playgroud)

bash shell-script function

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

我有多少贝壳?

问题:找出我有多少贝壳深。

详细信息:我经常从 vim 中打开外壳。构建并运行并退出。有时我忘记在里面打开另一个vim,然后打开另一个shell。:(

我想知道我有多少贝壳,甚至可能一直在我的贝壳屏幕上显示它。(我可以管理那部分)。

我的解决方案:解析进程树并查找 vim 和 bash/zsh 并找出当前进程在其中的深度。

这样的东西已经存在了吗?我找不到任何东西。

shell bash vim zsh shell-script

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

查找目录或文件的所有者,但只返回该所有者而不返回其他任何内容

我正在寻找一个命令,它将返回一个目录的所有者,而且只有那个——例如解析ls -lat命令的正则表达式或类似的东西?我想在另一个脚本中使用结果。

ls shell-script

75
推荐指数
3
解决办法
12万
查看次数

如何测量程序执行时间并将其存储在变量中

为了找出 Bash (v4+) 脚本中的某些操作需要多长时间,我想time“单独”解析命令的输出,并(最终)在 Bash 变量 ( let VARNAME=...) 中捕获它。

现在,我正在使用time -f '%e' ...(或者更确切地说command time -f '%e' ...是因为内置了 Bash),但是由于我已经重定向了执行命令的输出,我真的不知道我将如何捕获time命令的输出。基本上这里的问题是到输出分离time从被执行的命令(或多个)的输出。

我想要的是计算启动命令和完成命令之间的时间(以秒为单位)的功能。它不必是time命令或相应的内置命令。


编辑:鉴于以下两个有用的答案,我想添加两个说明。

  1. 我不想丢弃已执行命令的输出,但它最终是在 stdout 还是 stderr 上并不重要。
  2. 我更喜欢直接方法而不是间接方法(即直接捕获输出而不是将其存储在中间文件中)。

date到目前为止使用的解决方案接近我想要的。

bash shell-script time

75
推荐指数
5
解决办法
17万
查看次数

运行 ./script.sh vs bash script.sh - 权限被拒绝

当我尝试跑步时./script.sh我得到了Permission denied但是当我跑步时bash script.sh一切都很好。

我做错了什么?

bash permissions mount shell-script

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

如何让 bash 以与 pipefail 类似的方式在反引号失败时退出?

所以我喜欢尽可能地强化我的 bash 脚本(并且当不能委托给像 Python/Ruby 这样的语言时)以确保错误不会被发现。

在这种情况下,我有一个 strict.sh,其中包含以下内容:

set -e
set -u
set -o pipefail
Run Code Online (Sandbox Code Playgroud)

并在其他脚本中获取它。然而,虽然 pipefail 会出现:

false | echo it kept going | true

它不会拿起:

echo The output is '`false; echo something else`' 
Run Code Online (Sandbox Code Playgroud)

输出将是

输出是''

False 返回非零状态和非标准输出。在管道中它会失败,但在这里没有发现错误。当这实际上是存储在变量中的计算供以后使用,并且该值设置为空白时,这可能会导致以后出现问题。

那么 - 有没有办法让 bash 将反引号内的非零返回码视为足以退出的理由?

bash shell-script

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