标签: scripting

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

有没有一种简单的方法来替换/评估文件中的环境变量?假设我有一个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万
查看次数

shebang中的多个参数

我想知道是否有通过 shebang 行 ( #!)将多个选项传递给可执行文件的通用方法。

我使用 NixOS,在我编写的任何脚本中,shebang 的第一部分通常是/usr/bin/env. 然后我遇到的问题是系统将其后的所有内容解释为单个文件或目录。

例如,假设我想编写一个脚本以bash在 posix 模式下执行。写shebang的天真方式是:

#!/usr/bin/env bash --posix
Run Code Online (Sandbox Code Playgroud)

但是尝试执行生成的脚本会产生以下错误:

/usr/bin/env: ‘bash --posix’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我知道这篇文章,但我想知道是否有更通用和更清洁的解决方案。


编辑:我知道对于Guile脚本,有一种方法可以实现我想要的,在手册的第 4.3.4 节中记录:

 #!/usr/bin/env sh
 exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@"
 !#
Run Code Online (Sandbox Code Playgroud)

这里的技巧是,第二行(以 开头exec)被解释为代码,sh但是,在#!...!#块中,作为注释,因此被 Guile 解释器忽略。

难道不能将此方法推广到任何解释器吗?


第二次编辑:在玩了一会儿之后,似乎对于可以从中读取输入的解释器,stdin以下方法可以工作:

#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix …
Run Code Online (Sandbox Code Playgroud)

scripting environment-variables posix arguments shebang

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

带有 `#!/usr/bin/env 命令 --argument` 的 Shebang 行在 Linux 上失败

我有一个简单的脚本:

#!/usr/bin/env ruby --verbose
# script.rb
puts "hi"
Run Code Online (Sandbox Code Playgroud)

在我的 OSX 机器上,它运行良好:

osx% ./script.rb
hi
Run Code Online (Sandbox Code Playgroud)

但是,在我的 linux 机器上,它会引发错误

linux% ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我手动运行 shebang 线,它工作正常

linux% /usr/bin/env ruby --verbose ./script.rb
hi
Run Code Online (Sandbox Code Playgroud)

但是如果我打包ruby --verbose成一个参数,我可以复制错误env

linux% /usr/bin/env "ruby --verbose" ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory
Run Code Online (Sandbox Code Playgroud)

所以我认为这是如何env解释shebang线的重置的问题。我正在使用 GNU coreutils 8.4 env

linux% /usr/bin/env --version
env (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL …
Run Code Online (Sandbox Code Playgroud)

linux scripting executable env

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

$@ 除了第一个参数

我需要编写一个以这种方式运行的shell脚本:

./myscript arg1 arg2_1 arg2_2 arg2_3 ....... arg2_#
Run Code Online (Sandbox Code Playgroud)

脚本中有一个 for 循环

for i in $@
Run Code Online (Sandbox Code Playgroud)

但是,据我所知,$@ 包括 $1 到 $($#-1)。但是对于我的程序 $1 与 $2 $3 $4 等明显不同。我想从 $2 循环到最后......我该如何实现?谢谢:)

shell scripting bash

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

执行远程命令,完全脱离ssh连接

我有两台电脑,localpcremoteserver

我需要localpcremoteserver. 它需要做的一件事是启动一个运行数小时的备份脚本。我希望命令localpc“开火”然后完全独立运行remoteserver,就像一localpc开始就不存在一样。

这是我到目前为止所做的:

remoteserver 包含有脚本:

/root/backup.sh
Run Code Online (Sandbox Code Playgroud)

localpc 计划运行这个:

ssh root@remoteserver 'nohup /root/backup.sh' &
Run Code Online (Sandbox Code Playgroud)

我这样做是否正确?有一个更好的方法吗?这样做我会遇到任何麻烦吗?

scripting ssh nohup background-process

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

AutoHotkey 等价物

AutoHotkey 是否有等效的产品/方法?

对于那些不知道的人,它是一款允许您对鼠标移动和键盘进行编程的产品。这使我可以“宏”程序上的某些功能,而不必手动执行。在过去,他们习惯称他们为键盘填充器。但这只是解决方案的一半,因为我还需要一个“鼠标移动”填充器。

有这样的野兽吗?

scripting keyboard

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

如何在条件语句中退出脚本?

我正在编写一个 bash 脚本,如果用户不是 root,我想在其中退出。条件工作正常,但脚本不退出。

[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Run Code Online (Sandbox Code Playgroud)

我试过使用&&而不是,;但都不起作用。

shell scripting bash shell-script

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

在许多服务器上通过 SSH 自动运行命令

.txt 文件中有一个 IP 地址列表,例如:

1.1.1.1
2.2.2.2
3.3.3.3
Run Code Online (Sandbox Code Playgroud)

每个 IP 地址后面都有一个服务器,并且在每个服务器上都有一个在端口 22 上运行的 sshd。并非每个服务器都在known_hosts列表中(在我的 PC 上,Ubuntu 10.04 LTS/bash)。

如何在这些服务器上运行命令并收集输出?

理想情况下,我想在所有服务器上并行运行这些命令。

我将在所有服务器上使用公钥身份验证。

以下是一些潜在的陷阱:

  • ssh 提示我将给定的服务器 ssh 密钥放入我的known_hosts文件中。
  • 给定的命令可能返回非零退出代码,表明输出可能无效。我需要认识到这一点。
  • 与给定服务器的连接可能无法建立,例如由于网络错误。
  • 应该有一个超时,以防命令运行的时间比预期的要长,或者服务器在运行命令时出现故障。

服务器是 AIX/ksh(但我认为这并不重要。

scripting ssh parallelism

55
推荐指数
5
解决办法
22万
查看次数

在引导/启动期间运行脚本;init.d 与 cron @reboot

我目前正在尝试了解在系统启动/引导时运行脚本的init.dcron 和 cron之间的区别@reboot

使用的@reboot(这种方法中提到的这个论坛hs.chandra)是一些什么比较简单,通过简单地进入crontab -e并创建一个@reboot /some_directory/to_your/script/your_script.txt,然后your_script.txt,应在每次系统启动时执行。的深入解释@reboothere

或者通过嵌入/etc/init.d/your_script.txt到脚本的第二行,即:

#!/bin/bash
# /etc/init.d/your_script.txt
Run Code Online (Sandbox Code Playgroud)

您可以运行,chmod +x /etc/init.d/your_script.txt并且your_script.txt每次系统启动时也应该运行。

Q1:两者的主要区别是什么?
Q2:哪个更健壮?
Q3:两者中是否有更好的一个?
Q4:这是嵌入脚本以在启动期间运行的正确方法吗?

我将合并一个 bash .sh 文件以在启动期间运行。

startup scripting cron init-script sysvinit

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

unix shell 脚本的文件扩展名

在维基百科上,.sh的文章说:

有关 .sh 文件扩展名类型,请参阅Bourne shell

其他unix shell怎么样?

我知道在文件中 使用shebang来指示要执行的解释器,但我想知道:

  • 文件扩展名与无文件扩展名的优缺点是什么?

scripting conventions shell-script filenames files

54
推荐指数
5
解决办法
12万
查看次数