2012-12-19 56 views
2

所以我下面的腳本保存爲usr/local/bin/spawn這將打開一個新的終端窗口的過程,然後關閉該窗口:

#!/bin/sh 
osascript <<END 
tell app "Terminal" to do script "$1; logout" 
END 

所以我可以做

$ spawn nano 

nano開啓一個新的終端窗口,當我關閉nano窗口也關閉。

然而,spawn帶有參數的命令,像java -jar foo.jar,我需要使用

$ spawn "java -jar foo.jar" 

有沒有辦法改劇本,這樣同樣會不帶引號的工作?例如,

$ spawn java -jar foo.jar 

我利用this answer的伎倆,以不使用AppleScript解決一個問題都試過了。但是,當我嘗試使用spawn時,總會導致Terminal.app崩潰。有沒有辦法逃避"[email protected]"或這個問題的不同實現?它不一定非要使用AppleScript。

回答

0
#!/bin/sh 
osascript <<END 
tell app "Terminal" to do script "[email protected]; logout" 
END 

似乎爲我工作。

,將解決您的問題。將保存代碼在一個文件中的臨時文件夾中執行,並與終端打開它,像這樣的另一種選擇:

 
#!/bin/sh 
file=$(mktemp $TMPDIR/spawnXXXXXX) 
echo '#!/bin/sh' > "$file" 
echo "[email protected]" >> "$file" 
chmod +x "$file" 
open -a Terminal "$file" 

或者,如果你想打開它在您當前的終端程序(Terminal,iTerm 2等)中,您可以使用以下腳本:

 
#!/bin/sh 
file=$(mktemp $TMPDIR/spawnXXXXXX.command) 
echo '#!/bin/sh' > "$file" 
echo "[email protected]" >> "$file" 
chmod +x "$file" 
open "$file" 
+0

這有效,但並沒有解決Lauri Ranta帶來的逃生問題。 – Fenhl

+0

@Fenhl我不知道如何使用applescript,但我想我解決了你的問題。 – Tyilo

0

您的腳本沒有正確轉義。由於雙引號導致錯誤spawn 'echo "a"'會導致錯誤。

您可以使用運行處理程序參數傳遞給osascript:

#!/bin/bash 

osascript - "$*" <<END 
on run args 
tell app "Terminal" 
do script item 1 of args 
do script "logout" in window 1 
end 
end 
END 

"$*"就像"[email protected]"但在一個字的所有參數。

+0

這種方法會在新的產品即時產生時終止原始的終端窗口。 – Fenhl

+0

@Fenhl你殺什麼意思?註銷命令應該在打開的窗口中運行。如果您確實想關閉新窗口,請用'關閉窗口1'替換窗口1中的'do script「註銷。 – user495470

+0

我的意思是關閉,對不起。我對AppleScript瞭解不多,但它看起來像'window 1'是指我調用'spawn'腳本的窗口。 – Fenhl