我有一个简短的bash脚本来获取源代码的依赖文件。
#!/bin/sh
rule=$(cpp -P -w -undef -nostdinc -C -M file.cc)
rule=${rule##*:}
#echo $rule
echo ${rule//\\}
不幸的是,它会输出./findDep.sh: 5: ./findDep.sh: Bad substitution
。
但如果我取消注释echo $rule
,脚本将毫无问题地执行:
lib.h macro.inc fundamental.h lib/fs.h lib/net.h \ lib/net/fetch.h
lib.h macro.inc fundamental.h lib/fs.h lib/net.h lib/net/fetch.h
任何人都知道为什么?
提前致谢。
答案 0 :(得分:5)
您应该将#!/bin/sh
更改为#!/bin/bash
或#!/usr/bin/env bash
。
答案 1 :(得分:3)
我无法使用Bash 4.2.29重现您的问题。
但是,您是否知道默认情况下read
会加入包含\
换行符的行?
read rule < <(cpp -P -w -undef -nostdinc -C -M file.cc)
echo "${rule##*:}"
或者,以更sh
- 兼容的方式(我认为),
cpp -P -w -undef -nostdinc -C -M file.cc | {
read rule
echo "${rule##*:}"
}