1

我有一个简短的 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

有谁知道为什么?

提前致谢。

4

2 回答 2

5

您应该更改#!/bin/sh#!/bin/bash#!/usr/bin/env bash

于 2012-07-11T06:17:29.680 回答
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##*:}"
}
于 2012-07-11T06:23:28.077 回答