我想通过C#调用shell脚本,单纯的执行脚本没有任何问题,但是如果你要给shell脚本传递参数,那么死活传不进去。我找了好多资料,网上有人有是mono的bug..不过还是要感谢微博上好友 @程序员达达 告诉了我一个方法。
我的代码是这样的,我可以顺利的打开terrminal 也可以调用shell脚本,但是参数就是传递不进去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[MenuItem("Tools/1")] static void tools() { string command = "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal"; string shell = Application.dataPath +"/shell.sh"; string arg1 = "unity"; string arg2 = Application.dataPath +"/test.log"; string argss = shell +" "+ arg1 +" " + arg2; //有人说把空格 和 全部 用冒号 括起来, 但是还是没能成功。 //string argss = "\"" + shell +" "+ arg1 +" " + arg2 +"\""; //string argss = shell +"\" \""+ arg1 +"\" \""+ arg2; //string argss = "\"" + shell +"\" \""+ arg1 +"\" \""+ arg2+"\""; System.Diagnostics.Process.Start(command,argss); UnityEngine.Debug.Log(argss); } |
解决的办法是,不用terrminal去执行shell。因为不用terrmainal 就看不到echo的输出了,为了验证正确性,我用shell脚本来给指定路径下的一个文件写入内容。。
1 2 3 4 5 6 7 8 9 10 11 |
[MenuItem("Tools/1")] static void tools() { string shell = Application.dataPath +"/shell.sh"; string arg1 = "unity"; string arg2 = Application.dataPath +"/test.log"; string argss = shell +" "+ arg1 +" " + arg2; System.Diagnostics.Process.Start("/bin/bash", argss); } |
shell脚本很简单, 就是把参数1 写入 到参数2 路径下的文件里。
1 2 3 4 |
#!/bin/bash echo $1 >> $2 |
如下图所示,我把shell传入的参数顺利的写到了test.log文本里。。
最好还是要感谢微博上的那位同学,希望大家关注我的微博,互相学习吧嘿嘿。。
- 本文固定链接: https://www.xuanyusong.com/archives/2777
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
[MenuItem(“tools/1”)]
static void tolls()
{
string shell = Application.dataPath + “/shell.sh”;
string arg1 = “unity”;
string arg2 = Application.dataPath + “test.txt”;
string argss = shell + ” ” + arg1 + ” ” + arg2;
System.Diagnostics.Process.Start(“/bin/bash”, argss);
Debug.Log(“输出shell”);
}当我这样操作的时候,并没有出现预定的结果 我在中端中执行 zsh –version
是可以找到/bin/bash这个的 不知道为什么吗 来自10.15。3
特意,过来再回贴一下。亲测可用,直接执行shell,且能自动开启控制台,显示日志。目前最棒的方法。
System.Diagnostics.Process myCustomProcess = new System.Diagnostics.Process();
myCustomProcess.StartInfo.FileName = “osascript”;
myCustomProcess.StartInfo.Arguments = string.Format (“-e ‘tell application \”Terminal\” \n activate \n do script \”cd {0} && sh {1} {2} {3}\” \n end tell'”,Application.dataPath + “/Editor/Build/Build_iOS/”, “shell-just-build.sh”, projectPath, ipaFileName);
myCustomProcess.StartInfo.UseShellExecute = false;
myCustomProcess.StartInfo.RedirectStandardOutput = false;
myCustomProcess.Start();
myCustomProcess.WaitForExit ();
你这样拿不到真正的WaitForExit啊
这个办法。貌似比输出到Log里面更好一些。建议参考使用
https://forum.unity.com/threads/open-terminal-window-for-osx-system-diagnostics-process.512692/
我使用直接打开Terminal方式可以执行sh文件或者command文件,但是参数传递不过去,
使用 Process.Start(“/bin/bash”, argss); 方式则sh文件不会执行到,求教:是否是我的bash安装目录不在bin下导致?
有一个问题,如何在shell中通知unity,也就是例如shell执行结束之后如何触发unity脚本中的事件。我之前研究了OutputDataReceived委托,但好像没有办法触发了
话说你这个是针对 苹果的? windows 没有/bin/bash 这个目录吧
怎么样既能显示shell输出内容又能传递参数啊。
顶
非常有用,不过想请教下如果我要copy一个文件到另一个目录,.sh文件里面应该怎样写呢?对于shell命令不太会~非常感谢