执行系统命令

 
 
 

使用 system 命令将要执行的字符串传递到操作系统。将返回操作系统命令的输出。

例如:

system "ls -l";

在基于 UNIX 的系统(不是 Windows)上,这将以长格式打印当前目录到“脚本编辑器”(Script Editor)。Windows 等效:

system "dir";

后台进程(仅非 Windows)

若要在后台运行命令(即,执行非阻塞系统调用),则必须重定向所有命令的输出:

system("cmd >/dev/null 2>&1 &");

当然,可以发送输出到 /dev/null 之外的其他地方。

文件名

应始终将路径名括在引号中。尤其在 Mac OS 中,文件名可以包含拥有命令行含义的字符,如空格、|(管)、>(重定向)和 &(在后台运行)。

例如,不执行该操作:

string $fileName = {get this from somewhere}; system ("some_command " + $fileName);

...改为使用以下:

system ("some_command \"" + $fileName + "\"");

这使得代码独立于平台。

AppleScript 和 UNIX 使用不同的文件夹分隔符。AppleScript 使用冒号 (::),而 UNIX 使用正斜杠 (/)。此外,UNIX 中的体积带有前缀 /Volumes/,而在 AppleScript 中,路径以划分名称开头。

在以下示例中,一个名为 eagle.ma 的场景文件在名为 Emerald 的体积(划分)上。

AppleScript 表示为:

Emerald:projects:default:scenes:eagle.ma

UNIX 表示为:

/Volumes/Emerald/projects/default/scenes/eagle.ma

若要在文本编辑中打开 eagle.ma,您可以使用:

tell application "TextEdit" open "Emerald:projects:default:scenes:eagle.ma" end tell

若要从 Unix Shell 的文本编辑打开该文件,您可以输入:

open -e /Volumes/Emerald/projects/default/scenes/eagle.ma

文件引用和导入的文件名注意事项

无法从其名称是非法标识符的命令行引用或导入文件,除非明确使用 -rpr 或 -ns 标志。这将包含文件名以数字开始的文件。若要避免该问题,建议您避免命名文件,以便它们以数字开始。否则,您将需要使用以下解决方法。

解决方法

  • 使用 -rpr 或 -ns 标志明确指定有效的重命名前缀。
  • 重命名文件为以字母开头的名称(例如,a107953.sph.ma)。

线末端

若要将 UNIX 命令应用到 Mac OS X 上的 mayaAscii 场景文件内容中,将场景文件转化为具有 UNIX 线末端。您可以使用 Mac OS X tounix 命令执行该操作。

例如,如果您的 MEL 代码在另一个平台上看起来像这样:

string $fileName = {get this from somewhere}; string $result = system ("grep something" + $fileName);

...改为使用以下:

if ('about -mac') { 	system("tounix \"" + $fileName + "\""); } string $result = system ("grep something \"" + $fileName + "\"");