sh -xと./実行スクリプトの違い

sh -xと./実行スクリプトの違い

だから単純なシェルスクリプトがあります。実行時にこれら2つのコマンドの違いは何ですか?好む方法がありますか?

$sh -x foobar.sh

または

$./foobar.sh

2番目のコマンドで使用すると、スクリプトがより遅く実行されることがわかりました。

答え1

ファイルは、./foobar.sh最初#!の行の後に何でも実行することによって開始されます。この行を読むことは#!/bin/sh -xケースと同じです(shがPATHから来ていることを確認sh -x foobar.shすると仮定します)。おそらくaで始まらなかった/bin/shかもしれませんが?shbash

この-xフラグは、実行前に各コマンドのデバッグ情報を出力します。

答え2

これは、シェルスクリプトの内容と使用されるシェルによって異なります。シェルスクリプトには以下を含めることができます。定型句コード、次のように shebang と呼ばれます。

#!/usr/bin/env bash

特殊シーケンス「#!」は、exec()カーネルシステムコールに直後に定義されたプログラムをインタプリタとして使用するように指示します。つまり、2番目の実行方法を使用している場合は、そのファイルを実行するためにどのプログラムが使用されているかを確認するためにファイルを調べる必要があります。

また、bashマニュアル(bash -c "helpset")で

-x  Print commands and their arguments as they are executed.

コマンドで実行する操作 - bash を使用している場合は、以下の説明を参照してください。スクリプトの各行を印刷して実行します。奇妙なことに、これは最初のコマンドが2番目のコマンドよりも遅くなります。それとは反対ではありません(つまり、どちらの場合も同じインタプリタが使用されている場合)。もちろん、デバッグを望まない限り、-xなしでシェルを実行する方が一般的です。

結論:明示された理由のためここenvプログラムでshebangを使用してください(推奨)ここ) 2番目の実行方法を使用します。これは、最もプラットフォームに依存しない作業方法であり、好ましい方法です。

注:状況を複雑にするもう1つのことは、/ bin / shの背後にある実際のソルバーがシステムによって異なることです。多くの場合、これは実際にbashです。それが私が想定しているものです。

答え3

最初のバージョンである明示的な呼び出しは、shshを使用してスクリプトを実行します(必要に応じてトレースステートメントを表示-x)。 2番目は、明示的なインタプリタを指定せずにshebang行(存在する場合)に従うか、現在実行中のシェルをデフォルトとして使用します。

たとえば、スクリプトにshebang lineがある#! /bin/bash場合、またはシェルがbashの場合、2番目のフォームを使用すると./scriptshの代わりにbashが実行されます。 bashはshよりも多くの機能を備えたシェルであるため、パフォーマンス特性が異なる場合があります。

関連情報