我试图弄清楚-i
交互式选项cp
接受哪些词作为输入。
为方便起见,这里是设置实验文件的代码。
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
然后,shell 以交互方式询问每个文件是否应该被覆盖。它似乎接受各种随机输入。
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
我尝试查看 的源代码cp
,但我不知道 C 并且搜索overwrite
没有帮助。
据我所知,它接受一些单词作为覆盖的确认,而其他一切都被视为否。问题是甚至像ys
似乎被接受为的词yes
,所以我不知道什么有效,什么无效。
我想知道这究竟是如何工作的,并通过文档或可理解的源代码片段来证明这一点。
POSIX 标准仅指定响应需要是“肯定的”才能
-i
在生效时执行复制。对于 GNU
cp
,此时的实际输入由一个名为yesno()
. 该函数lib/yesno.c
在 gnulib 源代码分发的文件中定义,如下所示:如果不使用 NLS(“国家语言支持”),您可以看到该函数返回true的唯一回复是以大写或小写
Y
字符开头的回复。丢弃任何附加或其他输入。如果使用 NLS ,则调用该
rpmatch()
函数来确定响应是否是肯定的。NLS 库函数的目的rpmatch()
是确定给定字符串是否是肯定的(支持国际化)。在 BSD 系统上,相应的函数位于
src/bin/cp/utils.c
:这本质上与 GNU 代码中的非 NLS 代码路径相同。
如果您查看源代码并搜索,
interactive
您可以看到它设置了x.interactive = I_ASK_USER;
,因此您可以在此文件和其他I_ASK_USER
检查的文件中搜索。在
copy.c
您会在函数调用附近找到此符号overwrite_ok
,并且此函数包含对函数的调用yesno
。其余的留给读者练习。;-)