巴什 - 糟糕的替代品

时间:2012-07-11 06:13:14

标签: bash

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

任何人都知道为什么?

提前致谢。

2 个答案:

答案 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##*:}"
}