Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 与';cat&x27;命令_Cocoa_Terminal_Nstask_Cat - Fatal编程技术网

Cocoa 与';cat&x27;命令

Cocoa 与';cat&x27;命令,cocoa,terminal,nstask,cat,Cocoa,Terminal,Nstask,Cat,我尝试使用cat命令连接文件。 当我在终端中使用此功能时,一切正常: cat /Users/Home/Desktop/test.mp3* > test.mp3 尝试使用NSTask复制此命令时,会出现以下错误: 代码: NSArray *Args = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@*",[TAFileName stringByDeletingPathExtension]],@">",[TAFileN

我尝试使用cat命令连接文件。 当我在终端中使用此功能时,一切正常:

cat /Users/Home/Desktop/test.mp3* > test.mp3
尝试使用NSTask复制此命令时,会出现以下错误:

代码:

NSArray *Args = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@*",[TAFileName stringByDeletingPathExtension]],@">",[TAFileName stringByDeletingPathExtension],nil];
NSLog(@"%@",Args);
NSString *LaunchPath = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@""];
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];
NSLog输出:

(
"/Users/Home/Desktop/test.mp3*",
">",
"/Users/Home/Desktop/test.mp3"
)
错误:

cat: /Users/Home/Desktop/test.mp3*: No such file or directory
cat: >: No such file or directory
cat: /Users/Home/Desktop/test.mp3: No such file or directory

“startTaskWithLaunchPath:andArguments:showingProcess:”可以与许多其他终端命令配合使用,我100%确定这不是问题。

问题在于输入重定向和全局绑定,这是由shell(通常是#!/bin/bash)而不是cat命令处理的。因此,用一个参数启动一个任务,将“test.mp3*”扩展为一个真正的mp3名称,然后将其重定向到另一个位置,这是任务无法做到的


我建议您看看是否可以直接调用shell脚本,甚至可以在应用程序中动态创建它,然后将其作为bash应用程序的参数调用。然后它应该做您需要的事情。

问题在于输入重定向和全局绑定,这是由shell(通常是#!/bin/bash)处理的,而不是由cat命令处理的。因此,用一个参数启动一个任务,将“test.mp3*”扩展为一个真正的mp3名称,然后将其重定向到另一个位置,这是任务无法做到的


我建议您看看是否可以直接调用shell脚本,甚至可以在应用程序中动态创建它,然后将其作为bash应用程序的参数调用。然后它就可以满足您的需要。

我使用“/bin/sh”解决了这个问题。这会将命令解析为shell并像那样运行它。使用这个方法仍然输出“没有这样的文件”,但我通过改变任务初始工作目录解决了这个问题

启动任务的代码:

NSArray *Args = [NSArray arrayWithObjects:@"-c",[NSString stringWithFormat:@"cat %@.* >> %@",[[TAFileName lastPathComponent] stringByDeletingPathExtension],[[TAFileName lastPathComponent] stringByDeletingPathExtension]],nil];
NSString *LaunchPath = @"/bin/sh";
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];
更改目录的代码:

[TATask setCurrentDirectoryPath:[NSString stringWithFormat:@"%@/",[TAFileName stringByDeletingLastPathComponent]]];

这解决了一切。谢谢你,Michael。我用“/bin/sh”解决了这个问题。这会将命令解析为shell并像那样运行它。使用这个方法仍然输出“没有这样的文件”,但我通过改变任务初始工作目录解决了这个问题

启动任务的代码:

NSArray *Args = [NSArray arrayWithObjects:@"-c",[NSString stringWithFormat:@"cat %@.* >> %@",[[TAFileName lastPathComponent] stringByDeletingPathExtension],[[TAFileName lastPathComponent] stringByDeletingPathExtension]],nil];
NSString *LaunchPath = @"/bin/sh";
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];
更改目录的代码:

[TATask setCurrentDirectoryPath:[NSString stringWithFormat:@"%@/",[TAFileName stringByDeletingLastPathComponent]]];

这解决了一切。迈克尔,谢谢你的帮助。

由于某种原因,我没有收到你回复的通知,所以非常感谢。不过我不完全明白。真的没有别的目的地了,对吧?这一切都是在我的桌面上完成的(实际上取决于用户拖到我视图中的文件,但都是在一个文件夹中完成的)。即使split没有通配符,运行split也可以很好地工作。这与目标无关,而是与Unix shell中的语法有关。有一些工具(“cat”、“mv”、“cp”、“echo”),它们是真正的应用程序,它们接受参数(确切的文件名等)并执行一个函数——将数据输出到某个地方。还有一些shell(bash、csh等),它们提供了诸如将“test.mp3*”扩展为实际项“test.mp3.12345”(如果存在)等功能,并且shell还接收cat命令输出,并允许您说“>somefile.mp3”以重定向cat输出。因此,您试图在执行工具(“cat”)的同时使用shell的函数,这是有意义的。我需要使用NSFileHandle来处理输入和输出。我希望使用NSTimer可以防止GUI变得无响应(我目前在单独的线程上使用NSTimer处理输出)。非常感谢(我不能给你一个分数,因为我是新来的,我需要15个声誉)。如果可能的话,我建议在自己的NSThread中运行该任务,这样它肯定不会阻塞。如果您确实想要更高级的文件输出和操作,那么最好使用一个程序来编写某种shell脚本,然后通过bashshell运行它。这比听起来容易(将文件写入临时位置,使用bash和相同的代码执行)。你可以在谷歌上搜索大量的教程(“bash脚本”)。我不太熟悉NSThreads等,但当我尝试在单独的线程中运行NSTask时,它并没有解决我的GUI问题。无论我处理的文件有多大,在单独的线程中使用NSTimer都可以正常工作。但是创建我自己的bash脚本看起来是一个很棒的主意。我一定会调查的。由于某种原因,我没有收到你回复的通知,所以非常感谢。不过我不完全明白。真的没有别的目的地了,对吧?这一切都是在我的桌面上完成的(实际上取决于用户拖到我视图中的文件,但都是在一个文件夹中完成的)。即使split没有通配符,运行split也可以很好地工作。这与目标无关,而是与Unix shell中的语法有关。有一些工具(“cat”、“mv”、“cp”、“echo”),它们是真正的应用程序,它们接受参数(确切的文件名等)并执行一个函数——将数据输出到某个地方。还有一些shell(bash、csh等),它们提供了诸如将“test.mp3*”扩展为实际项“test.mp3.12345”(如果存在)等功能,并且shell还接收cat命令输出,并允许您说“>somefile.mp3”以重定向cat输出。因此,您试图在执行工具(“cat”)的同时使用shell的函数,这是有意义的。我需要使用NSFileHandle来处理输入和输出。我希望使用NSTimer可以防止GUI变得无响应(我目前在单独的线程上使用NSTimer处理输出)。非常感谢(我不能给你一个分数,因为我是新来的,我需要15个声誉)。如果可能的话,我建议在自己的NSThread中运行该任务,这样它肯定不会阻塞。如果您确实想要更高级的文件输出和操作,那么最好使用一个程序来编写某种shell脚本,然后通过bashshell运行它。这比听起来容易(将文件写入临时位置,使用bash和相同的代码执行)。你可以在谷歌上搜索大量关于它的教程(“bash脚本”)