【问题标题】:Bash script - Run commands that correspond to the lines of a fileBash 脚本 - 运行与文件行对应的命令
【发布时间】:2023-04-02 17:17:01
【问题描述】:

我有一个这样的文件(text.txt):

ls -al
ps -au
export COP=5
clear

每一行对应一个命令。在我的脚本中,我需要阅读每一行并启动每个命令。

ps:我尝试了所有这些选项,但在使用“export”命令时,我遇到了同样的问题。文件中有“export COP=5”,但运行脚本后,如果我在同一个终端中回显$COP,则不会显示任何值

【问题讨论】:

  • 如果你不知道这个文件来自哪里,你最好注意在chroot'ed环境中运行
  • 如果他不知道文件来自哪里,他根本不应该执行它。 Chrooting 只是一个基本的保护层,你不能相信它。
  • 关于“ps”:(普通)脚本中定义的变量永远不会应用于父 shell,即使在导出时也是如此(export 将它们标记为导出到子进程;没有办法导出到父进程)。如果要在脚本中定义变量并在脚本完成后仍然定义它们,则需要使用source 运行脚本,而不是作为普通脚本运行。

标签: bash file command


【解决方案1】:
while IFS= read line; do eval $line; done < text.txt

要小心,通常不建议使用 eval,因为它非常强大并且很容易被滥用。
但是,如果没有非特权用户对 text.txt 的影响风险,那应该没问题。

【讨论】:

  • 要保护转义字符和空格,请使用while IFS= read -r line
  • 这很好用!我对“导出”命令有疑问。文件中有“export COP=5”,但运行脚本后,如果我在同一个终端中回显 $COP,则不会显示任何值
  • 那是因为它在另一个 bash shell 中,执行后它会退出 shell,所以那里的所有变量都丢失了。我不知道你到底想做什么,但如果你想保留一些变量,你可以例如将导出写入文件(echo 'export COP=5' >> variables.source)然后“source variables.source”执行后将变量放入 bash shell。
【解决方案2】:

为了避免混淆,我只需将文件从text.txt 重命名为text 并添加一个shebang(例如#!/bin/bash)作为文件的第一行。通过调用chmod +x text 确保它是可执行的。之后就可以按预期执行了。

$ cat text
#!/bin/bash
ls -al
ps -au
clear

$ chmod +x text
$ ./text

【讨论】:

    【解决方案3】:
    cat test.txt | xargs -l1 bash -c '"$@"' echo
    

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2015-09-20
      • 2013-12-07
      相关资源
      最近更新 更多