终端(Shell)上命令实质上就是可执行程序。那么如何实现本人的命令,如何让Shell能辨认和运行咱们本人的可执行程序呢?
运行环境
用户在Shell中输出一个外部命令后,只是将可执行文件的名字通知了Shell,而后Shell就会去寻找这个文件并执行。
为了解决这个问题shell引入了一个PATH变量
$echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Shell即会到PATH对应的目录中找寻用户输出的命令程序,当然咱们能够追加本人的可执行文件目录,也就是常说的环境变量配置
实现可执行文件
接下来用OC来实现一个可执行程序,首先Xcode创立一个Command Line Tool
创立完失去一个洁净的C语言的main函数入口
1. 获取输出参数
首先配置main函数输出参数,仅在Xcode运行测试应用,Product-Scheme-Edit Scheme-Arguments
int main(int argc, const char * argv[]) { @autoreleasepool { for (int i =0; i< argc; i++) { printf("输出参数:%s\n",argv[i]); } } return 0;}
失去以下输入
输出参数:/Users/niang/Library/Developer/Xcode/DerivedData/TSProj-celbcreghvkbbochdmxixomyftvb/Build/Products/Debug/MyCMD输出参数:aaa输出参数:bbbProgram ended with exit code: 0
由输入可得,第一个参数默认是可执行程序所在的目录
2. 终端运行测试
首先配置以后可执行文件目录到PATH
export MY_CMD_PATH=/Users/niang/Library/Developer/Xcode/DerivedData/TSProj-celbcreghvkbbochdmxixomyftvb/Build/Products/Debug/export PATH=$MY_CMD_PATH:$PATH
再输出咱们的程序名,疏忽大小写
第一个参数并未如之前猜想那样的是可执行文件目录,它仅仅输入一个程序名
3. 获取可执行文件目录和以后所在目录
int main(int argc, const char * argv[]) { @autoreleasepool { NSString *url = [NSBundle mainBundle].executableURL.absoluteString; url = [url stringByReplacingOccurrencesOfString:@"file://" withString:@""]; url = [url stringByDeletingLastPathComponent]; printf("可执行文件目录 : %s\n", url.UTF8String); //https://stackoverflow.com/questions/65702034/getcwd-vs-get-current-dir-name char cd_path[256]; memset(cd_path, 0, sizeof(cd_path)); if (getcwd(cd_path, sizeof(cd_path)) == NULL) { perror("getcwd"); exit(EXIT_FAILURE); // or abort() } NSString *cdPath = [NSString stringWithUTF8String:cd_path]; printf("shell当前目录 : %s\n", cdPath.UTF8String); } return 0;}
4. 交互式命令
printf("您中午想吃什么?: "); char food[30]; scanf("%s", food); printf("中午去吃: %s。\n", food);
利用场景
在咱们iOS我的项目中有多套证书因需频繁切换证书和bundleId等Xcode配置信息,由此制作了一个本人命令轻松切换各种配置
记得将可执行文件拷贝到罕用目录中再配置PATH,防止后续不小心革除Xcode缓存找不到