3

次のテスト スクリプトの出力について説明していただけますか。

# prepare test data
echo "any content" > myfile

# set bash to inform me about the commands used
set -x

cat < myfile

出力:

+cat
any content

つまり、+ で始まる行に「< myfile」ビットが表示されないのはなぜですか?

bashにそれを強制する方法。次のように、スクリプトの動作をユーザーに通知する必要があります。

mysql -uroot < the_new_file_with_a_telling_name.sql

そして私はできません。

編集: 追加のコンテキスト: 変数を使用します。元のコード:

SQL_FILE=`ls -t $BACKUP_DIR/default_db* | head -n 1` # get latest db
mysql -uroot mydatabase < ${SQL_FILE}

-v変数は展開されずcat file.sql | mysql、次の 2 行が生成されます。

+mysql
+cat file.sql

そのため、トリックも行いません。

4

3 に答える 3

5

set -vまたはset -o verbose代わりに、コマンドエコーを有効にすることもできます。

私のマシンで実行した例:

[me@home]$ cat x.sh 
echo "any content" > myfile
set -v
cat < myfile

[me@home]$ bash x.sh 
cat < myfile
any content

ここでの注意点はset -v、コマンドを文字通りエコーするだけで、シェルの拡張や反復は行わないということです。コメントでJonathanが指摘しているように、ファイル名が変数(たとえば)で定義されている場合、これは問題になる可能性があり、何が参照されてcommand < $somefileいるかを特定するのが困難になります。$somefile

于 2013-01-22T15:30:53.843 に答える
3

違いは非常に単純です。

  • 最初のケースでは、プログラム を使用しており、 の内容を の標準入力にcatリダイレクトしています。これは、 を実行していることを意味し、 ;があるときに表示されます。myfilecatcatbashset -x

  • 考えられる2番目のケースではcat myfile、@Jonathan Lefflerが指摘したように、を使用できます。これは、実行しているものです。パラメーターを持つ+cat myfileプログラムです。catmyfile

からman bash:

  -x      After  expanding  each  simple  command,  for command, case command,
          select command, or arithmetic  for  command,  display  the  expanded
          value  of PS4, followed by the command and its expanded arguments or
          associated word list.

ご覧のとおり、展開されたコマンド ラインとその引数リストを表示するだけです。リダイレクトは、展開されたコマンドのcat一部でも、その引数リストの一部でもありません。

@Shawn Chin が指摘したように、次のようset -vに を使用できman bashます。

  -v      Print shell input lines as they are read.
于 2013-01-22T15:28:04.413 に答える
2

基本的に、それbashがその-xコマンドで機能する方法です。Solaris 5.10 ボックスを確認したところ、/bin/sh(本物の Bourne シェルに近い) そこにも I/O リダイレクションが省略されています。

コマンド ファイル ( x3.sh) の場合:

echo "Hi" > Myfile
cat < Myfile
rm -f Myfile

Solaris マシンでのトレース出力は次のとおりです。

$ sh -x x3.sh
+ echo Hi 
+ cat 
Hi
+ rm -f Myfile 
$ /bin/ksh -x x3.sh
+ echo Hi
+ 1> Myfile
+ cat
+ 0< Myfile
Hi
+ rm -f Myfile
$ bash -x x3.sh
+ echo Hi
+ cat
Hi
+ rm -f Myfile
$

bashand sh(これらは明らかに異なる実行可能ファイルです) は同じ出力を生成することに注意してください。出力には、I/O リダイレクション情報が含まれkshます。Korn シェルのスコアは 1 です。

この特定の例では、次を使用できます。

cat myfile

ファイルの名前を表示します。一般的なケースでは難しいですが、I/O リダイレクトを報告するksh代わりに使用することを検討してください。bash

于 2013-01-22T15:29:18.307 に答える