bash - 是否可以运行不包括最后一行的 shell 脚本?
问题描述
假设我有一个文件test.sh
包含
echo "hello world";
echo "goodbye world"
是否可以执行除最后一行之外的所有内容而无需修改文件?
解决方案
至少对于简单的脚本,您可以即时修改脚本文件。您的脚本文件不受此影响:
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
也许您可以通过在脚本中注入一个陷阱来解决这两个问题,该陷阱会抑制命令执行并丢弃最后一个命令。但即便如此,我也能想到一些可能会失败的情况。
推荐阅读
- python - 无法控制 api json 格式、文本或视频结果?
- r - 从R studio,tidyverse中将数值与字符分开
- django - Django:无法使用 TemplateView.as_view() 加载管理页面和 HTML 页面
- java - 如何使用java在excel中读取列?
- spring-mvc - 如何从 Liferay 7.1 中的 url 中删除 '/o' 前缀
- html - 如何从值为真的 JSON 中提取键
- cluster-analysis - 了解聚类中的轴
- c# - 使用 IEnumerable 从连接中返回 IQueryable
- spring-boot - 如何使用springboot将所有微服务日志记录在一个日志文件中
- microcontroller - 在 I2C 总线中,从设备如何知道数据是否属于它们