0

Swift Mac アプリから端末コマンドを実行しようとしています。実際のパスを指定しなくても、ユーザーが端末で行うように任意のコマンドを入力できるようにします。コマンドを実行して、$PATH 変数で指定されたすべてのパスを検索する方法はありますか?

パスを指定するとコマンドを実行できますが、システムの $PATH 変数の任意のパスからバイナリを自動検索する必要があります

    let path = "/usr/bin/killall"
    let arguments = ["Dock"]
    let task = Process.launchedProcess(launchPath: path, arguments: arguments)
    task.waitUntilExit()

将来的には、.sh ファイルを読み取り、その中のすべての行を実行したいと考えています。そのため、長いスクリプトでは、すべてのバイナリがデフォルト パスにあるわけではありません。

ありがとう!

4

1 に答える 1

5

次の方法でコマンドを実行できますenv

env utility argument ...

例:

let path = "/usr/bin/env"
let arguments = ["ls", "-l", "/"]
let task = Process.launchedProcess(launchPath: path, arguments: arguments)
task.waitUntilExit()

env変数を使用して指定されたユーティリティを見つけ、指定$PATHされた引数でそれを実行します。別の検索パスと追加の環境変数を指定する追加のオプションがあります。

(これは Swift の機能ではなく、macOS や他の多くのオペレーティング システムの機能です。)

Finder から起動した場合 (ダブルクリック) は、シェル環境PATHの とは異なる場合があります。PATH必要に応じて、追加のディレクトリを追加できます。

var env = task.environment ?? [:]
if let path = env["PATH"] {
    env["PATH"] = "/usr/local/bin:" + path
} else {
    env["PATH"] = "/usr/local/bin"
}
task.environment = env

execlp友人も実行可能ファイルを見つけます$PATHが、提供するのは「生の」C インターフェイスのみです。

于 2017-01-07T20:07:57.657 に答える