이것은 내 오리너구리 튜토리얼의 샘플 코드입니다. 저는 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" "$@"