这是代码的一部分
scanf("%[^\n]%*c",command);
int pid;
pid=fork();
if (pid == 0) {
// Child process
char *argv[]={command ,NULL};
execvp(argv[0], argv);
exit (0);
}
当我输入ls
时,我想作为输出
1 copy of mysh1.c mysh1.c mysh3.c mysh.c New Folder
a.out helpmanual.desktop mysh2.c mysh4.c New File
当我给ls -l /tmp
时
我在等。
total 12
-rw------- 1 antre antre 0 Nov 4 17:31 config-err-KT9sEZ
drwx------ 2 antre antre 4096 Nov 4 19:21 mozilla_antre0
drwx------ 2 antre antre 4096 Jan 1 1970 orbit-antre
drwx------ 2 antre antre 4096 Nov 4 17:31 ssh-HaOFtKdeIQnQ `
但我接受:
1 copy of mysh1.c mysh1.c mysh3.c mysh.c New Folder
a.out helpmanual.desktop mysh2.c mysh4.c New File
答案 0 :(得分:0)
由于某种原因,您似乎正在尝试解析C程序中ls -l
的输出。
这不太可能成为“正确”的事情。通常的机制是使用opendir
和readdir
直接读取目录文件。
如果你有一些真正奇怪的情况,你不能opendir
(唯一的想法是你在远程系统上运行ls
,例如,ssh
1}}),GNU ls
中有一种模式,专门用于生成可由另一个程序解析的输出记录格式。
来自GNU coreutils info
:
‘-D’
‘--dired’
使用长列表('-l')格式,之后再打印一行 主要产出:
//DIRED// BEG1 END1 BEG2 END2 ...
BEGN和ENDN是记录字节的无符号整数 输出中每个文件名的开头和结尾的位置。 这使得Emacs可以轻松找到名称,即使它们也是如此 包含不寻常的字符,如空格或换行符,没有花哨 搜索。
如果以递归方式列出目录('-R'),则输出a 与每个子目录名称的偏移类似的行:
//SUBDIRED// BEG1 END1 ...
最后,输出一行格式:
//DIRED-OPTIONS// --quoting-style=WORD
其中WORD是引用样式(* note Formatting the file
names::
)。
这是一个实际的例子:
$ mkdir -p a/sub/deeper a/sub2
$ touch a/f1 a/f2
$ touch a/sub/deeper/file
$ ls -gloRF --dired a
a:
total 8
-rw-r--r-- 1 0 Jun 10 12:27 f1
-rw-r--r-- 1 0 Jun 10 12:27 f2
drwxr-xr-x 3 4096 Jun 10 12:27 sub/
drwxr-xr-x 2 4096 Jun 10 12:27 sub2/
a/sub:
total 4
drwxr-xr-x 2 4096 Jun 10 12:27 deeper/
a/sub/deeper:
total 0
-rw-r--r-- 1 0 Jun 10 12:27 file
a/sub2:
total 0
//DIRED// 48 50 84 86 120 123 158 162 217 223 282 286
//SUBDIRED// 2 3 167 172 228 240 290 296
//DIRED-OPTIONS// --quoting-style=literal
请注意上面'// DIRED //'行上的偏移对 划定这些名称:'f1','f2','sub','sub2','deep','file'。 '// SUBDIRED //'行的偏移量分隔以下内容 目录名称:'a','a / sub','a / sub / deep','a / sub2'。
以下是如何提取第五个条目名称的示例, '更深',对应于一对偏移,222和228:
$ ls -gloRF --dired a > out
$ dd bs=1 skip=222 count=6 < out 2>/dev/null; echo
deeper
请注意,虽然上面的列表包含一个尾部斜杠 “更深”的条目,偏移量选择没有的名称 尾随斜线。但是,如果您使用'--dired'调用'ls' 使用像'--escape'(又名'-b')这样的选项并对文件进行操作 其名称包含特殊字符,请注意反斜杠 包含 :
$ touch 'a b'
$ ls -blog --dired 'a b'
-rw-r--r-- 1 0 Jun 10 12:28 a\ b
//DIRED// 30 34
//DIRED-OPTIONS// --quoting-style=escape
如果您使用添加引号的引用样式(例如, '--quoting-style = c'),然后偏移量包括引号。所以 请注意,用户可以通过选择引用样式 环境变量'QUOTING_STYLE'。因此,应用程序使用 '--dired'应该指定一个显式的 '--quoting-style = literal'选项(又名'-N'或'--literal')就可以了 命令行,或者准备解析转义的名称。
答案 1 :(得分:0)
我只需要使用strtok