首页 > 解决方案 > 是否可以运行不包括最后一行的 shell 脚本?

问题描述

假设我有一个文件test.sh包含

echo "hello world";
echo "goodbye world"

是否可以执行除最后一行之外的所有内容而无需修改文件?

标签: bashshell

解决方案


至少对于简单的脚本,您可以即时修改脚本文件。您的脚本文件不受此影响:

head -n-1 test.sh | bash

但请记住,这只会删除最后一行,而不是最后一个命令。如果您的文件以尾随的新行或注释结尾,那么只有那些将被删除并且最后一个命令仍然被执行。您可以尝试先删除尾随注释和换行符,例如:

tac test.sh | sed -E '1,/^[ \t]*[^ \t#]/d' | tac | bash

警告 1

如果脚本中的最后一个命令跨越多行,则上述两种方法都会失败。例如,如果最后一个命令是以下命令之一,那么只有部分命令将被删除,并且 bash 可能会或可能不会因语法错误而中止。

if condition; then
  body
fi

cat << eof
  text
eof

echo arg1 \
arg2

警告 2

如果您的脚本使用函数,那么这可能会删除函数调用,因此会删除多个命令。例如,当最后一个“命令”被删除时,下面的脚本不会做任何事情:

#! /usr/bin/env bash
main() {
  first command
  second command
  ...
}
main

DEBUG也许您可以通过在脚本中注入一个陷阱来解决这两个问题,该陷阱会抑制命令执行并丢弃最后一个命令。但即便如此,我也能想到一些可能会失败的情况。


推荐阅读