makefileで、シェルコマンドで変更する前後の同じファイルのタイムスタンプを比較する方法は?

KKG

まず、このmakefileは機能しません

all:
    A=$(shell stat -c %Y test1);\
    echo "A is $$A";\
    touch test1;\
    B=$(shell stat -c %Y test1);\
    echo "B is $$B";\
    if (($$A<$$B)); then echo true; fi

シェルでの出力:

$ make
A=1513082575;\
echo "A is $A";\
touch test1;\
B=1513082575;\
echo "B is $B";\
if (($A<$B)); then echo true; fi
A is 1513082575
B is 1513082575

時間は変わらず、touch test1あとで実行されたA=$(shell stat -c %Y test1);思いますB=$(shell stat -c %Y test1);

そしてこれはうまくいくようです:

all:
    A=$(shell stat -c %Y test1);\
    echo "A is $$A";\
    C=$(shell touch test1);\
    B=$(shell stat -c %Y test1);\
    echo "B is $$B";\
    if (($$A<$$B)); then echo true; fi

シェルでの出力:

$ make
A=1513083955;\
echo "A is $A";\
C=;\
B=1513084224;\
echo "B is $B";\
if (($A<$B)); then echo true; fi
A is 1513083955
B is 1513084224
true

しかし$(shell touch test1)、私は望んでいません、この機能を実装する他の方法はありますか?

ルノー・パカレット

$(shell...)あなたのレシピでは、makeが展開される前にレシピが実際にシェルに渡されます。したがって、という名前のファイルがtest1存在し、そのタイムスタンプがである1513082575場合、makeは最初にレシピを次のように展開します。

A=1513082575;\
echo "A is $A";\
touch test1;\
B=1513082575;\
echo "B is $B";\
if (($A<$B)); then echo true; fi

これをシェルで実行すると、得られた結果が得られます。本当にタイムスタンプをレシピで取得したい場合は、以下を使用しないでください$(shell...)

all:
    A=$$(stat -c %Y test1);\
    echo "A is $$A";\
    touch test1;\
    B=$$(stat -c %Y test1);\
    echo "B is $$B";\
    if ((A<B)); then echo true; fi

注1:$シェル用に保持したいmakeを2倍にして、展開をエスケープします($$)。

注2:bashマニュアルの算術評価セクションから:

式内では、パラメーター展開構文を使用せずに、シェル変数を名前で参照することもできます。

したがって、bashでは、次の理由でif((A<B))...同じことをif(($A<$B))...行い、望ましいです。

  • $レシピでエスケープする必要はありません、
  • シェル変数のエキゾチックな値(空白、引用符など)に注意を払う必要はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ファイルのEOLを変更し、同じ名前でファイルを保存するPerlコマンド

分類Dev

Ansible:シェルコマンドでファイルの変更を確認する方法は?

分類Dev

ファイルの「最終変更」タイムスタンプに「ls」コマンドで年のみが表示されるのはなぜですか?

分類Dev

コマンドプロンプトでコピー中にファイルの名前を変更する方法

分類Dev

コマンドプロンプトでコピー中にファイルの名前を変更する方法

分類Dev

2つのブランチが同じファイルに変更を加えました。1つのブランチで行われたファイルの変更をコミットし、githubマスターブランチにプッシュする方法は?

分類Dev

シェルスクリプトでmvコマンドを使用してファイルのパーツの名前を変更する

分類Dev

VisualStudioでカスタムファイル固有のコマンド/タスクを実行する方法は?

分類Dev

パターン一致後にファイルの名前を変更するzmvコマンド

分類Dev

1行のコマンドでファイルの名前を変更する

分類Dev

1行のコマンドでファイルの名前を変更する

分類Dev

シェルコマンドラインスクリプトでファイル名の名前を変更する方法(アンダースコアをスペースに置き換える)

分類Dev

シェルコマンドラインスクリプトでファイル名の名前を変更する方法(アンダースコアをスペースに置き換える)

分類Dev

単一のコマンドでカスタムPowerShellプロファイルをロードする方法

分類Dev

現在の日付スタンプでファイルの名前を変更する(batファイル)

分類Dev

同じスタイル内のセッターを使用して、スタイル付きコントロール内の同じタイプの要素を異なる方法で変更するにはどうすればよいですか?

分類Dev

OSXでJavaScript、Perl、またはシェルによって作成された日付のタイムスタンプでファイル名の名前を変更するにはどうすればよいですか?

分類Dev

一部のディレクトリ内のファイルのタイムスタンプを変更するためのTouchコマンドに相当するWindowsとは何ですか、Windowsのバッチ組み込みコマンドで実現する方法

分類Dev

GulpタスクでHTMLファイルの後にzipファイルの名前を変更する方法

分類Dev

VSコード:Angularテンプレートファイルでリファクタリング(変数の名前変更)する方法は?

分類Dev

Vue-異なるコンポーネントで同じ要素のスタイルを変更する方法

分類Dev

ファイルのタイムスタンプで定義された月と年を追加してファイルの名前を変更する

分類Dev

あるインターフェイスのインバウンドトラフィックを同じマシンの別のインターフェイスにルーティングするにはどうすればよいですか?

分類Dev

Phonegap Androidでダウンロードした後、ファイルシステム内のファイルの名前を変更する

分類Dev

fedoraシステムのコマンドラインでbz2ファイルを抽出する方法は?

分類Dev

Windowsでファイルをコピーまたは移動するときにタイムスタンプが変更されるのはなぜですか?

分類Dev

コンパイルタスクの前にシェルコマンドを実行する方法は?

分類Dev

変数の割り当て後に同じ行でコマンドを実行することはシェルポータブルですか?

分類Dev

Pythonインタープリターシェルで最後のコマンドを繰り返す方法は?

Related 関連記事

  1. 1

    ファイルのEOLを変更し、同じ名前でファイルを保存するPerlコマンド

  2. 2

    Ansible:シェルコマンドでファイルの変更を確認する方法は?

  3. 3

    ファイルの「最終変更」タイムスタンプに「ls」コマンドで年のみが表示されるのはなぜですか?

  4. 4

    コマンドプロンプトでコピー中にファイルの名前を変更する方法

  5. 5

    コマンドプロンプトでコピー中にファイルの名前を変更する方法

  6. 6

    2つのブランチが同じファイルに変更を加えました。1つのブランチで行われたファイルの変更をコミットし、githubマスターブランチにプッシュする方法は?

  7. 7

    シェルスクリプトでmvコマンドを使用してファイルのパーツの名前を変更する

  8. 8

    VisualStudioでカスタムファイル固有のコマンド/タスクを実行する方法は?

  9. 9

    パターン一致後にファイルの名前を変更するzmvコマンド

  10. 10

    1行のコマンドでファイルの名前を変更する

  11. 11

    1行のコマンドでファイルの名前を変更する

  12. 12

    シェルコマンドラインスクリプトでファイル名の名前を変更する方法(アンダースコアをスペースに置き換える)

  13. 13

    シェルコマンドラインスクリプトでファイル名の名前を変更する方法(アンダースコアをスペースに置き換える)

  14. 14

    単一のコマンドでカスタムPowerShellプロファイルをロードする方法

  15. 15

    現在の日付スタンプでファイルの名前を変更する(batファイル)

  16. 16

    同じスタイル内のセッターを使用して、スタイル付きコントロール内の同じタイプの要素を異なる方法で変更するにはどうすればよいですか?

  17. 17

    OSXでJavaScript、Perl、またはシェルによって作成された日付のタイムスタンプでファイル名の名前を変更するにはどうすればよいですか?

  18. 18

    一部のディレクトリ内のファイルのタイムスタンプを変更するためのTouchコマンドに相当するWindowsとは何ですか、Windowsのバッチ組み込みコマンドで実現する方法

  19. 19

    GulpタスクでHTMLファイルの後にzipファイルの名前を変更する方法

  20. 20

    VSコード:Angularテンプレートファイルでリファクタリング(変数の名前変更)する方法は?

  21. 21

    Vue-異なるコンポーネントで同じ要素のスタイルを変更する方法

  22. 22

    ファイルのタイムスタンプで定義された月と年を追加してファイルの名前を変更する

  23. 23

    あるインターフェイスのインバウンドトラフィックを同じマシンの別のインターフェイスにルーティングするにはどうすればよいですか?

  24. 24

    Phonegap Androidでダウンロードした後、ファイルシステム内のファイルの名前を変更する

  25. 25

    fedoraシステムのコマンドラインでbz2ファイルを抽出する方法は?

  26. 26

    Windowsでファイルをコピーまたは移動するときにタイムスタンプが変更されるのはなぜですか?

  27. 27

    コンパイルタスクの前にシェルコマンドを実行する方法は?

  28. 28

    変数の割り当て後に同じ行でコマンドを実行することはシェルポータブルですか?

  29. 29

    Pythonインタープリターシェルで最後のコマンドを繰り返す方法は?

ホットタグ

アーカイブ