在目录名称中要求在斜杠后面添加斜杠是一种好习惯吗?


9

我想请bash脚本的用户传递目录路径作为参数。以下哪一项是良好的编程习惯?

  • 要求用户输入尾随/(正斜杠)
  • 要求用户不要输入尾随/(正斜杠)

3
请注意,它的rsync行为根据尾随的存在而以非常重要的方式表现出不同/,因此在某些情况下,您需要标准化以保持一致性,而在另一些情况下,则需要简洁地通过以实现用户所说的内容(如果它们知道他们在跟rsync)。
2013年

最近另一个让我感到惊讶的是,ls -l dir其行为与ls -l dir/if dir是指向目录的符号链接不同。
Flimm 2013年

Answers:


27

最佳做法是不做任何假设。

如果您有权访问路径构建器实用程序/类,请使用那些,如果没有,请编写代码以接受任一种格式并采取相应措施。

对于用户而言,最令人烦恼的莫过于必须记住是否添加斜杠。


6
推论:用合适的命令行工具总是解析路径- dirnamebasenamereadlink。一个非常常见的问题是使用${path##*/}代替basename,但是如果路径以斜杠结尾,则返回一个空字符串而不是最后一个路径元素。
l0b0 2011年

1
+1用于使用实用程序类。我不能说我多少次看到开发人员在组装路径时重新发明轮子,而如今大多数框架都可以轻松地完成这一工作。
RationalGeek

1
另外,当某些应用程序要求我以特定方式执行此操作时,我会非常恼火。有时用户无法控制该路径的编写方式:有时他们会写它,所以是的,他们选择使用或不使用斜杠来编写,但是在用户使用TAB自动完成的情况下,许多shell会在其后加上斜杠,所以您需要用户删除它?甚至更烦人的是,如果您将斜杠放在作为参数传递的目录中,那么应用程序的行为会有所不同(rsync我在看着您)
CarlosCampderrós2011年

最近,我需要验证用户输入的斜杠以与rsync一起使用(因为它对这些东西很敏感)。正如@ChrisF所指出的,最好的做法是不做任何假设。我想出了以下两种方法来作为两种假设的优美方式:${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))为了清楚起见,我还进行了简要记录:在bash中添加或删除尾部斜杠
John Mark Mitchell

10

由于bash会忽略多个斜杠,因此可以安全地假定用户未在路径中输入尾随的斜杠并自己添加了一个斜杠。

cat /etc/hosts

是一样的

cat /////etc//////////hosts

因此您的脚本可能如下所示:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

而且您不必担心用户是否在路径中输入尾随/。


5
Nit:那不是bash行为,内核会这么做。
Blrfl 2011年

7

已故的乔恩·波斯特尔(Jon Postel)在RFC 760的 3.2节中提出了一些很好的建议,这些建议在此处适用:

通常,实现应在发送行为上保持保守,而在接收行为上则应保持自由。也就是说,应谨慎发送格式正确的数据报,但应接受它可以解释的任何数据报(例如,不反对含义仍然清晰的技术错误)。


3

从概念上讲,斜杠不是名称的一部分。斜线只是名称之间的分隔符。我的主目录是/ home / stefan,而不是/ home / stefan /。

正如ammoQ已经指出的那样,如果您不希望出现斜杠,那么如果有斜杠,也不会失败。但是您可以轻松地将名称和var粘合在一起,因为您不必引用斜杠:

a="/home"
b="stefan"

dir=$a/$b

0

对于控制台上的交互使用,要求目录必须不包含斜杠将非常烦人:自动完成TAB会自动为目录添加斜杠。

因此,您当然需要允许使用斜杠指定目录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.