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