2017-03-05 1 views
0

これは私の問題を示しているメイクファイルの低下した例である:実行エラー

exec: 
    time (ls > ls.txt; echo $$? > code) 2> time.txt 

は1つのLinuxのインストール下の罰金のexec実行します:

Linux-2.6.32-642.4.2.el6.x86_64-x86_64-with-centos-6.8-Final 

をそれが下の失敗私のUbuntuインストール:

Linux-4.4.0-64-generic-x86_64-with-Ubuntu-16.04-xenial 

とprメッセージをoduces:私は、端末から直接コマンド時間を実行

/bin/sh: 1: Syntax error: word unexpected (expecting ")") 

問題はありませんならば。

異なるLinuxインストールではコマンドのバージョンが異なりますか?一連のコマンドを許可するバージョンが必要です。

答えて

0

「時間」の前にセミコロンを付けます。つまり、makeはあなたのコマンドを依存関係のリストとして解析しようとしています。

2

レシピを実行するには常に/bin/shを呼び出します。いくつかのシステムでは、/bin/shはbashのエイリアスで、標準のPOSIXシェル(sh)に多くの拡張機能があります。 (Ubuntuのような)他のシステムでは、/bin/shはdashのエイリアスです。これは、小さくてシンプルな単純なPOSIXシェルに近いものです。

バッシュにはtimeオペレーションが組み込まれており、パイプライン全体を受け入れ、それに要した時間を表示します(ドキュメントを見るにはbashシェルコマンドプロンプトでhelp timeを実行してください)。ダッシュのような他のシェルにはtimeが組み込まれていないので、実行するとプログラムは/usr/bin/timeになります。マニュアルを見るにはman timeを実行してください。別のプログラムとして、パイプライン全体を時間を割くことはできません(パイプラインはシェルの機能なので)。それは1つの個々のコマンドの時間だけです。

あなたは、さまざまなオプションがあります。

あなたは常に追加することによって、そのシェルとしてbashのを使用するようにメイクファイルを強制することができます。

SHELL := /bin/bash 

をそれに。そこにコメントを追加して、bashが具体的に必要な理由を説明することをお勧めします。

それともtimeだけ呼び出すための一つのコマンド持つようにシェル呼び出しが明示的にすることによって、移植可能な方法で動作するようにルールを変更することができます

exec: 
     time /bin/sh -c 'ls > ls.txt; echo $$? > code' 2>/time.txt 
0

を働いていた唯一の提案は、私の中ではbashを強制することですメイクファイル:

SHELL := /bin/bash 

私がチェック:私のUbuntuマシンで、/ binに/ shが、それは/ binに/ bashのであるCentOSのマシン上のに対し、実際に/ binに/ダッシュです!

ありがとうございます!

+0

ところで、シェル呼び出しを明示的にすると、出力ファイルが 'time.txt'にリダイレクトされませんでした。 – Tsf