使用makefile

时间:2015-07-13 01:40:41

标签: bash shell makefile

我有一个包含函数sedstr:

的文件sedstr.sh
#!/bin/bash
function sedstr {
# From stackoverflow.com/a/29626460/633251 (Thanks Ed!)
    old="$1"
    new="$2"
    file="${3:--}"
    escOld=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$old")
    escNew=$(sed 's/[&/\]/\\&/g' <<< "$new")
    sed -i.tmp "s/\<$escOld\>/$escNew/g" "$file" # added -i.tmp
    echo "sedstr done"
}

我有一个外部文件“test”,可以使用以下内容进行编辑:

My last name is Han.son and I need help.
If the makefile works, I'll have a new last name.

我想用makefile中的参数调用sedstr函数。不应返回任何内容,但应编辑外部文件。这是一个不起作用的小makefile:

all: doEdit

doEdit:
  $(shell ./sedstr.sh) # I was hoping this would bring the function into the scope, but nay
  $(shell sedstr 'Han.son', 'Dufus', test)

如何使用makefile中的变量调用此函数?错误是:

make: sedstr: Command not found
make: Nothing to be done for `all'.

2 个答案:

答案 0 :(得分:2)

make配方中的每一行都在自己的shell中执行。

同样,每次调用$(shell)也是如此。

他们不分享国家。

要做你想做的事,我们需要一个

的食谱线
$(shell . ./sedstr.sh; sedstr 'Han.son' 'Dufus' test)

这就是说没有理由在这里使用$(shell)因为你已经在shell上下文中了,因为你可以很容易地(并且更正确地)使用配方行的

. ./sedstr.sh; sedstr 'Hans.son' 'Dufus' test

是的,原文中的逗号是不正确的。

答案 1 :(得分:1)

您可以从sedstr.sh内部调用该函数。最后

sedstr "$1" "$2" "$3"

EDIT 或者看其他答案