这是我的鸭嘴兽教程中的示例代码。我正在尝试使其与名为 的命令一起使用pymol
,并且我希望它打开 .pdb 文件或仅打开pymol
.我对perl一无所知,但我有基本的sh知识,可以做别名和修改.zshrc
文件。
据 CommonMedia Inc 报道,
Platypus 填补了这一空白,它是一个方便的小实用程序,可以用 Unix 脚本制作应用程序包。请注意,我在那里没有说“Perl”。 Platypus 可以像 Perl 一样轻松地使用 shell 脚本、Python、PHP、Ruby 和 Tcl。正如开发人员所描述的,“这是通过将脚本与运行该脚本的可执行二进制文件一起包装在应用程序包目录结构中来完成的。”
因此,希望这里有人可以帮助制作一个小的、可用的水滴(拖放图标)来打开放入此应用程序的文件(同时切换到文件的路径)。
#!/usr/bin/perl
use strict;
use File::Basename;
my $cmd = "/usr/bin/tar cvfz";
# Get enclosing folder of first file
my($fn, $directory) = fileparse($ARGV[0]);
# Change to that directory
chdir($directory);
# Archive is created there
my $dest_path = "Archive.tgz";
my $files;
foreach(@ARGV)
{
my($filename, $directory) = fileparse($_);
$files .= "'$filename' ";
}
print $cmd . "\n";
system("$cmd $dest_path $files");
答案1
我不会对此置之不理,因为这个脚本有几个严重错误。但是,因为我不知道脚本应该做什么,所以这个答案不会解决您的问题。
chdir($directory);
可能会失败。你需要处理这错误。chdir($directory) or die "chdir($directory): $!";
$files .= "'$filename' "
不是对文件名的正确引用:如果文件名包含'
.您可以使用 准备文件名$filename =~ s/'/'\\''/
,但实际上有更好的方法来执行此操作(请参阅下一点)。system
使用单个参数调用 shell。但您没有使用任何 shell 功能,因此您应该使用列表形式。这样您就不需要构建一个收集所有文件名的字符串:只需使用您已有的列表即可。my @cmd = qw(/usr/bin/tar cvfz); system(@cmd, $dest_path, @ARGV);
您仍然需要处理来自 的错误
system
。system(@cmd, $dest_path, @ARGV) or die "Call to $cmd[0] failed with status $?";
如果这是您的脚本执行的最后一件事,请调用
exec
反而。exec(@cmd, $dest_path, @ARGV) or die "exec $cmd[0] failed: $!";
到目前为止,您可以在 shell 中轻松完成所有这些操作。
#!/bin/sh
set -e
cmd='tar cvzf'
dest_path='Archive.tgz'
cd -- "$(dirname -- "$0")"
echo "$cmd $dest_path $*"
exec $cmd "$dest_path" "$@"