Mac上自制终端命令行程序
angriso -终端(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
输入参数:bbb
Program 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缓存找不到
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。