1

サイトへのログインを成功させるために、複雑で長い行コマンドを作成します。コンソールで実行すると動作します。しかし、同じ行をコピーして bash スクリプトに貼り付けると、機能しません。

いろいろ試してみたのですが、たまたま回線を使わないと

#!/bin/sh

それはうまくいきます!Mac OSX Lion でこれが起こるのはなぜですか? この構成行はbashスクリプトで何をしますか?

4

3 に答える 3

4

/bin/sh経由で実行される bash スクリプトは、 sh 互換モードで実行されます。これは、多くの bash 固有の機能 (ヒアストリング、プロセス置換など) が機能しないことを意味します。

sh-4.2$ cat < <(echo 123)
sh: syntax error near unexpected token `<'

完全な bash 構文を使用できるようにしたい場合は#!/bin/bash、シバン行として使用してください。

于 2012-05-25T23:02:57.073 に答える
1

「#!/bin/sh」は、スクリプトの実行に正しいインタープリターが使用されることを保証するための一般的なイディオムです。ここで、「sh」は「Bourne Shell」です。シェル スクリプトの優れた標準的な「最小公分母」。

ただし、あなたの場合、「#!/bin/sh」は間違ったインタープリターのようです。

ここにもう少し情報があります:

http://www.unix.com/answers-frequently-asked-questions/7077-what-does-usr-bin-ksh-mean.html

当初、UNIX にはシェルが 1 つしかありませんでした。コマンドの実行を要求すると、シェルは exec() システム コールの 1 つを呼び出そうとします。コマンドが実行可能ファイルの場合、exec は成功し、コマンドが実行されます。exec() が失敗した場合、シェルはあきらめず、コマンド ファイルをシェル スクリプトであるかのように解釈しようとします。

その後、UNIX はより多くのシェルを手に入れ、状況は混乱しました。ほとんどの人は、あるシェルでスクリプトを書き、別のシェルでコマンドを入力します。また、各シェルには、スクリプトをインタープリターに供給するための異なるルールがありました。

これは、「#! /」トリックが発明されたときです。アイデアは、カーネルの exec() システム コールがシェル スクリプトで成功するようにすることでした。カーネルがファイルを exec() しようとすると、マジック ナンバーと呼ばれる整数を表す最初の 4 バイトが調べられます。これにより、ファイルの実行を試みるかどうかがカーネルに通知されます。そこで、カーネルが知っているマジックナンバーに「#!/」を追加し、実際にシェルスクリプトを単体で実行できるように拡張しました。しかし、「#! /」を入力できず、スペースを空け続けた人もいました。そのため、「#!/」が特別な 3 バイトのマジック ナンバーとして機能するように、カーネルが少し拡張されました。

So#! /usr/bin/ksh#!/usr/bin/kshnow は同じ意味です。少なくとも一部のカーネルは後者を理解していない可能性があるため、私は常に前者を使用します。

また、最初の行はカーネルへのシグナルであり、シェルへのシグナルではないことに注意してください。シェルが exec() 経由でスクリプトを実行しようとすると、成功するだけです。また、さまざまなフォールバック スキームに出くわすことはありません。

于 2012-05-25T23:00:43.187 に答える
0

スクリプトの最初の行を使用して、使用するスクリプト インタープリターを選択できます。

#!/bin/bash

/bin/bash インタープリターを呼び出してスクリプトを実行するようにシェルに指示しています。#!/bin/bash の前にスペースや空行がないことを確認してください。そうしないと機能しません。

于 2012-05-25T23:05:15.363 に答える