2

Linux コマンド プロンプトから動作する次のコマンド ラインがあります。

vi /tmp/test.txt -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

vim次のコマンドを含む一時ファイルを (プロセス置換を使用して) 作成します。

:1 s/^\/\/ VERSION: .*$/\/\/ VERSION: $(date)/g

/tmp/test.txt編集用にファイルを開き、以前に作成した一時ファイルからコマンドを実行します。行 1 を見つけて、その行を現在のタイム スタンプに置き換えます。次のようになります。

// VERSION: Fri Apr 12 21:20:03 CEST 2013
...
...

次に、必要な編集を行い、ファイルを保存することにした場合にのみ、すべての変更がディスクにコミットされます。最初にディスク上のファイルを変更してからエディタを起動するというオプションはありません。コンテンツ自体は変更されていませんが、ファイルのタイムスタンプは異なるためです。

これまでのところ、設計/意図どおりに機能します。

今、私はこの vi コマンド ラインを make ファイルに移動しようとしていますが、そこで失敗します。構築を試みました$(shell .....)が、make がエラーをスローしています。

edit:
        $(shell vi $(src).cpp -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

Makefile の行が余分な引用符と括弧をいじる方法を理解しようとしていますが、まだ解決していません。

Ubuntu Linux 12.10 と GNU Make 3.81 を実行しています

vi project.cpp -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

Make は "Process Substitution" 構造を好まないようです<( command )。余分な (実際の) ファイルを使用したくありません。

€ make edit
vi project.cpp -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )
/bin/sh: 1: Syntax error: "(" unexpected
make: *** [edit] Error 2
4

1 に答える 1

11

make レシピ内での使用$(shell ...)は事実上決して正しくありません。すでにシェルに入っています...必要なコマンドを直接入力するだけです。make 関数を使用しようとすると、$(shell ...)混乱が生じるだけです。$と書いて脱出する必要があります$$

別の問題があります。make常に使用してスクリプトを呼び出し/bin/sh、bash 固有の構成 ( <(...)) を使用しています。

もちろん、より大きな問題は、たとえば vised用に設計されたものではなく、なぜこのような自動化された変更を行うために、ビジュアル エディターである vi を使用しているのかということです。私はそれを次のように書き直します:

edit:
        sed -i "1 s,^// VERSION: .*,// VERSION: $$(date)," $(src).cpp

本当に vi を使いたい場合は、次のようにする必要があります。

SHELL := /bin/bash

edit:
        vi '$(src).cpp' -s <( echo ":1 s/^\/\/ VERSION: .*$$/\/\/VERSION: $$(date)/g" )
于 2013-04-12T19:45:30.270 に答える