Como eu faço um droplet / .app no ornitorrinco para o meu comando unix?

2

Este é o meu código de amostra do tutorial do ornitorrinco. Eu estou tentando fazer isso funcionar com um comando chamado pymol , e eu quero abrir arquivos .pdb ou abrir apenas pymol . Eu não sei nada sobre perl, mas eu tenho conhecimento sh básico e posso fazer aliases e modificar arquivos .zshrc .

De acordo com o CommonMediaInc,

Filling the gap is Platypus, a handy little utility which makes application bundles out of Unix scripts. Notice I didn’t say “Perl” there. Platypus plays nicely with shell scripts, Python, PHP, Ruby, and Tcl just as easily as Perl. As the developer describes it, “this is done by wrapping the script in an application bundle directory structure along with an executable binary that runs the script.”

Então, esperamos que alguém aqui possa ajudar com a criação de um droplet pequeno e utilizável (ícone de arrastar e soltar) para abrir arquivos soltos nesse app (ao alternar para o caminho do arquivo).

#!/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");
    
por user8259 10.06.2011 / 16:57

1 resposta

1

Eu não vou deixar isso sem resposta, porque há algumas coisas seriamente erradas com este script. No entanto, como não sei o que o script deve fazer, essa resposta não resolverá seu problema.

  • chdir($directory); pode falhar. Você precisa tratar do Erro .

    chdir($directory) or die "chdir($directory): $!";
    
  • $files .= "'$filename' " não é o melhor para um nome de arquivo: ele falhará se o nome do arquivo contiver ' . Você poderia preparar o nome do arquivo com $filename =~ s/'/'\''/ , mas na verdade existe uma maneira melhor de fazer isso (veja o próximo ponto).

  • system com um único argumento chama um shell. Mas você não está usando nenhum recurso de shell, então você deve usar o formulário de lista. E assim você não precisa construir uma string que reúna todos os nomes de arquivos: apenas use a lista que você já tem.

    my @cmd = qw(/usr/bin/tar cvfz);
    system(@cmd, $dest_path, @ARGV);
    
  • Você ainda precisa lidar com erros de system .

    system(@cmd, $dest_path, @ARGV) or die "Call to $cmd[0] failed with status $?";
    

    Se esta é a última coisa que o seu script faz, ligue para exec em seu lugar.

    exec(@cmd, $dest_path, @ARGV) or die "exec $cmd[0] failed: $!";
    

Até agora você pode fazer tudo isso facilmente no shell.

#!/bin/sh
set -e
cmd='tar cvzf'
dest_path='Archive.tgz'
cd -- "$(dirname -- "$0")"
echo "$cmd $dest_path $*"
exec $cmd "$dest_path" "$@"
    
por 10.06.2011 / 23:24