오리너구리에서 Unix 명령에 대한 Droplet/.app을 어떻게 만드나요?

오리너구리에서 Unix 명령에 대한 Droplet/.app을 어떻게 만드나요?

이것은 내 오리너구리 튜토리얼의 샘플 코드입니다. 저는 pymol.pdb 파일을 열거나 그냥 .pdb 파일을 열도록 하려고 합니다 pymol. 저는 Perl에 대해 아무것도 모르지만 기본적인 sh 지식이 있고 별칭을 지정하고 .zshrc파일을 수정할 수 있습니다.

커먼미디어(CommonMedia Inc)에 따르면,

Platypus는 Unix 스크립트에서 애플리케이션 패키지를 만들 수 있는 편리한 작은 유틸리티로 이러한 격차를 해소합니다. 여기서는 "Perl"이라고 말하지 않았습니다. Platypus는 Perl처럼 쉽게 쉘 스크립트, 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단일 인수로 셸을 호출합니다. 하지만 쉘 기능을 사용하지 않으므로 목록 형식을 사용해야 합니다. 이렇게 하면 모든 파일 이름을 수집하는 문자열을 작성할 필요가 없습니다. 이미 가지고 있는 목록을 사용하면 됩니다.

    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: $!";
    

지금까지는 이 모든 작업을 셸에서 쉽게 수행할 수 있었습니다.

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

관련 정보