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并将产生两行:

+mysql
+cat file.sql

所以也没有诀窍。

4

3 回答 3

5

您可以尝试set -vset -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只是在字面上回显命令,而不进行任何 shell 扩展或迭代。正如 Jonathan 在评论中指出的那样,如果文件名是在变量中定义的(例如command < $somefile),这可能是一个问题,从而难以识别$somefile所指的内容。

于 2013-01-22T15:30:53.843 回答
3

那里的区别很简单:

  • 在第一种情况下,您正在使用程序cat,并且您正在将 的内容重定向myfile到 的标准输入cat。这意味着您正在执行cat,这就是您执行bash时所显示的set -x

  • 在可能的第二种情况下,您可以使用cat myfile,正如@Jonathan Leffler 所指出的那样,您会看到+cat myfile,这就是您正在执行的:cat带有参数的程序myfile

来自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 shell)也省略了 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 重定向信息 — Korn shell的ksh得分 1。

在此特定示例中,您可以使用:

cat myfile

查看文件的名称。在一般情况下,这很困难,但请考虑使用ksh代替bash来获取报告的 I/O 重定向。

于 2013-01-22T15:29:18.307 回答