Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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
C 使用-&引用;启动文件且不与标志冲突_C_Unix - Fatal编程技术网

C 使用-&引用;启动文件且不与标志冲突

C 使用-&引用;启动文件且不与标志冲突,c,unix,C,Unix,我试图在C中复制“ls”命令。它应该包含0到2个参数,这些参数是文件路径和一组标志。当传递1个参数时,我试图区分传递一个文件和传递一组标志-我认为最明显的方法是假设文件名都不是以“-”开头的,因此,如果参数的第一个字符是“-”,那么将其视为一组标志,否则,将其视为文件路径 我应该如何区分这两者呢?好吧,ls的规则是——考虑到——a是一个文件: ls-a:-a被视为选项参数 ls--a:-a被视为文件参数 --参数被视为一个分隔符,后面的所有参数都是文件,而不是选项。那么,ls的规则是-考虑到

我试图在C中复制“ls”命令。它应该包含0到2个参数,这些参数是文件路径和一组标志。当传递1个参数时,我试图区分传递一个文件和传递一组标志-我认为最明显的方法是假设文件名都不是以“-”开头的,因此,如果参数的第一个字符是“-”,那么将其视为一组标志,否则,将其视为文件路径


我应该如何区分这两者呢?

好吧,ls的规则是——考虑到
——a
是一个文件:

  • ls-a
    -a
    被视为选项参数
  • ls--a
    -a
    被视为文件参数

--
参数被视为一个分隔符,后面的所有参数都是文件,而不是选项。

那么,ls的规则是-考虑到
-a
是一个文件:

  • ls-a
    -a
    被视为选项参数
  • ls--a
    -a
    被视为文件参数
--
参数被视为一个分隔符,在此分隔符之后,所有参数都是文件,而不是选项。

通常情况下,程序不这样做,并将其留给用户处理产生的问题

例如,创建一个名为
-l
的文件和至少一个其他文件,然后运行
ls*

me@localhost:~$ mkdir temp
me@localhost:~$ cd temp
me@localhost:~/temp$ touch ./-l
me@localhost:~/temp$ touch testfile
me@localhost:~/temp$ ls *
-rw-rw-r-- 1 acampbell acampbell 0 Apr  4 11:00 testfile
me@localhost:~/temp$ 
ls*
扩展为
ls-l测试文件

大多数Unix实用程序都可以接受参数--,并且
--
之后的每个参数都将被视为文件名:

me@localhost:~/temp$ ls -l -- testfile
-rw-rw-r-- 1 acampbell acampbell 0 Apr  4 11:00 testfile
me@localhost:~/temp$ ls -- -l testfile
-l  testfile
me@localhost:~/temp$ 
它们还可以指定不以
-
开头的路径,例如使用冗余的
/

me@localhost:~/temp$ ls ./*
./-l ./testfile
me@localhost:~/temp$
通常情况下,程序不会这样做,而是让用户来处理由此产生的问题

例如,创建一个名为
-l
的文件和至少一个其他文件,然后运行
ls*

me@localhost:~$ mkdir temp
me@localhost:~$ cd temp
me@localhost:~/temp$ touch ./-l
me@localhost:~/temp$ touch testfile
me@localhost:~/temp$ ls *
-rw-rw-r-- 1 acampbell acampbell 0 Apr  4 11:00 testfile
me@localhost:~/temp$ 
ls*
扩展为
ls-l测试文件

大多数Unix实用程序都可以接受参数--,并且
--
之后的每个参数都将被视为文件名:

me@localhost:~/temp$ ls -l -- testfile
-rw-rw-r-- 1 acampbell acampbell 0 Apr  4 11:00 testfile
me@localhost:~/temp$ ls -- -l testfile
-l  testfile
me@localhost:~/temp$ 
它们还可以指定不以
-
开头的路径,例如使用冗余的
/

me@localhost:~/temp$ ls ./*
./-l ./testfile
me@localhost:~/temp$

--
用于结束开关并消除歧义。否则,
ls
只是假设开关。不要自己编写所有内容。使用
getopt
库。
--
用于结束开关并消除歧义。否则,
ls
只是假设开关。不要自己编写所有内容。使用
getopt
库It’这真是有趣的行为,谢谢你解释:)那;'It’这真是有趣的行为,谢谢你解释:)