有没有一种简单的方法来替换/评估文件中的环境变量?假设我有一个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_ID用INSTANCE_ID环境变量的值替换文件$SERVICE_NAME中的SERVICE_NAMEenv var的值。我不会先验地知道需要哪些环境变量(或者,如果有人向配置文件添加了新的环境变量,我不想更新脚本)。谢谢!
scripting shell-script text-processing environment-variables
我想知道是否有通过 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) 我有一个简单的脚本:
#!/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) 我需要编写一个以这种方式运行的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 循环到最后......我该如何实现?谢谢:)
我有两台电脑,localpc和remoteserver。
我需要localpc在remoteserver. 它需要做的一件事是启动一个运行数小时的备份脚本。我希望命令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)
我这样做是否正确?有一个更好的方法吗?这样做我会遇到任何麻烦吗?
AutoHotkey 是否有等效的产品/方法?
对于那些不知道的人,它是一款允许您对鼠标移动和键盘进行编程的产品。这使我可以“宏”程序上的某些功能,而不必手动执行。在过去,他们习惯称他们为键盘填充器。但这只是解决方案的一半,因为我还需要一个“鼠标移动”填充器。
有这样的野兽吗?
我正在编写一个 bash 脚本,如果用户不是 root,我想在其中退出。条件工作正常,但脚本不退出。
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Run Code Online (Sandbox Code Playgroud)
我试过使用&&而不是,;但都不起作用。
.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)。
如何在这些服务器上运行命令并收集输出?
理想情况下,我想在所有服务器上并行运行这些命令。
我将在所有服务器上使用公钥身份验证。
以下是一些潜在的陷阱:
known_hosts文件中。服务器是 AIX/ksh(但我认为这并不重要。
我目前正在尝试了解在系统启动/引导时运行脚本的init.dcron 和 cron之间的区别@reboot。
使用的@reboot(这种方法中提到的这个论坛由hs.chandra)是一些什么比较简单,通过简单地进入crontab -e并创建一个@reboot /some_directory/to_your/script/your_script.txt,然后your_script.txt,应在每次系统启动时执行。的深入解释@reboot是here
或者通过嵌入/etc/init.d/your_script.txt到脚本的第二行,即:
#!/bin/bash
# /etc/init.d/your_script.txtRun Code Online (Sandbox Code Playgroud)
您可以运行,chmod +x /etc/init.d/your_script.txt并且your_script.txt每次系统启动时也应该运行。
Q1:两者的主要区别是什么?
Q2:哪个更健壮?
Q3:两者中是否有更好的一个?
Q4:这是嵌入脚本以在启动期间运行的正确方法吗?
我将合并一个 bash .sh 文件以在启动期间运行。
在维基百科上,.sh的文章说:
有关 .sh 文件扩展名类型,请参阅Bourne shell。
其他unix shell怎么样?
我知道在文件中 使用shebang来指示要执行的解释器,但我想知道:
scripting ×10
shell-script ×3
bash ×2
shell ×2
ssh ×2
arguments ×1
conventions ×1
cron ×1
env ×1
executable ×1
filenames ×1
files ×1
init-script ×1
keyboard ×1
linux ×1
nohup ×1
parallelism ×1
posix ×1
shebang ×1
startup ×1
sysvinit ×1