我有以下代码:
NSString *currentpath;
NSFileManager *filemgr = [NSFileManager defaultManager];
[filemgr changeCurrentDirectoryPath:@"/Users/BestUser/Downloads"];
currentpath = [filemgr currentDirectoryPath];
NSLog (@"Current directory is %@", currentpath);
当我在终端中运行它时,它记录该路径已更改为目录Downloads。
但是我在终端中的当前目录不会更改。
是否可以通过Objective-C在终端中更改目录?
答案 0 :(得分:2)
每个进程都有自己的> python3 test.py
[1, 1, 0, 1]
>
,即working directory
环境变量。当您在当前Shell会话中执行类似PWD
的命令时,它将启动另一个./ChangeDirectory
,该命令是该命令的进程,并非所有环境变量都将初始化为{ {1}}会话,subshell
就是那个会话。
在子shell中更改当前工作目录/ subshell
变量时,新变量不会影响父进程的环境。这使您的不变。
答案 1 :(得分:0)
有两种不同的方法可能阻止它按照您的描述进行工作。
首先,-[NSFileManager changeCurrentDirectoryPath:]
可能返回NO
,表明它无法根据请求更改当前目录。之所以会发生这种情况,是因为该路径不存在或无法访问-并且在macOS 10.15 Catalina上,作为安全措施,脚本可能无法访问某些路径(如“下载”)。您的代码应检查该方法的返回值并处理错误情况。
第二,即使您没有运行Catalina或选择一个 可访问的文件夹,在shell中运行编译的程序也不会更改该shell中的当前目录。 bash
和类似Shell上的行为是故意的,如several other questions中所述-您的呼叫更改了进程的工作目录,但所做的更改确实不会传播到父进程。 (此处链接的最后一个问题描述了解决此问题的方法,但作者建议不要使用该策略。)
答案 2 :(得分:0)
您的代码将更改当前目录以供其使用。同样,即使您在终端中更改当前目录,该更改也仅对一个终端会话有效。
目标是什么?您是否要在系统启动时设置当前目录?还是您正在尝试将文件存储到特定目录?有很多方法可以实现这一目标,但是您必须详细说明自己的要求。