【问题标题】:how to invoke unix command in perl如何在 perl 中调用 unix 命令
【发布时间】:2015-01-08 15:46:32
【问题描述】:

我正在尝试执行以下 unix 命令,但它没有被执行

$array_of_tables= `dbsmp $srv_name`;
print "$array_of_tables\n";

请帮助我通过 perl 脚本找出数据库中的表列表。

我还尝试使用以下命令将文件从路径复制到不同的路径:-

copy(`cd /osp/slee/service/$srv_name/bin/exec/script.txt`,`cd /osp/local/home/linus/amit/scripts`);

但出现错误:-

Usage: copy(FROM, TO [, BUFFERSIZE])

请提供一些解决方案 谢谢

【问题讨论】:

  • 你的第二个命令应该是copy('/osp/.../script.txt', '/osp/.../scripts');(注意撇号不是反引号)
  • 只是不要调用外部命令并使用强大且可移植的核心模块,perldoc.perl.org/File/Copy.html

标签: perl unix


【解决方案1】:

使用双引号代替反引号。

copy("/osp/slee/service/$srv_name/bin/exec/script.txt","/osp/local/home/linus/amit/scripts");

并删除cd

【讨论】:

  • 现在我没有收到那个特定的错误,但是文件没有被复制到给定的路径。有没有其他方法可以在 perl 脚本中复制 unix 平台上的文件?
【解决方案2】:

在 Perl 中,捕获系统 (shell) 命令输出的首选方法是 qx() 运算符。见http://perldoc.perl.org/perlop.html#Quote-Like-Operators

$array_of_tables = qx(dbsmp $srv_name);
print("$array_of_tables\n");

实际上,反引号也应该起作用,所以问题一定出在您的 dbsmp 命令上。我不确定那个命令是什么;您必须提供有关该实用程序以及您看到的错误的更多信息。

为了比较,我可以使用以下 shell 命令将本地 postgres 数据库中的表列表检索为管道分隔的表:

> psql -tAXq main postgres <<<\\d;

这可以从 Perl 运行如下:

> perl -e 'print(qx(psql -tAXq main postgres <<<\\\\d;));'

【讨论】:

  • 反引号 qx 操作符(就像双引号是qq,单引号是q)
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2019-10-15
  • 2012-03-29
  • 2016-12-30
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多