カタツムリで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" "$@"

関連情報