技术解析

目录加“/”和不加有什么区别呀?
0
2021-06-15 14:49:44
idczone

Linux 的目录加“/”和不加有什么区别?配环境变量突然想到这个问题,为什么不加“/”! cd 加不加都没差,很疑惑。


环境变量是个 key- value,加与不加要看怎么用。
cd 命令,是因为 cd 帮你做了判断

rsync 中有区别

加 /表示绝对路径,不加表示相对路径,cd 不加没区别是因为系统已经将 /usr/bin 加入到环境变量中去了。

他问的是加在文件夹末尾的 / 吧,比如 /data/ /data 都可以

嗯,是的,是我没说清楚!

有斜杠说明肯定是个目录,没斜杠有可能是个文件。
对 cd 来说没区别因为它后面肯定是目录,对别的命令可能有区别。

通常来说,后面加 / 才是文件夹,否则应该是文件。
由于文件夹和文件不能重名(好像是?),所以,加不加都可以,系统等各方面会自动识别,但是在遇到问题的时候记得有没有 / 其实是两码事。
不然这种小问题 够你头大的。

自动补全的时候都加了 /

mv 等命令加不加后面的斜杠好像会影响行为的

自己看代码
static void update_cwd(void)
{
cwd = xrealloc_getcwd_or_warn(cwd);
if (!cwd)
cwd = xstrdup(bb_msg_unknown);
}
/* built-in 'cd ' handler */
static int builtin_cd(struct child_prog *child)
{
char *newdir;
if (child->argv[1] == NULL)
newdir = getenv("HOME");
else
newdir = child->argv[1];
if (chdir(newdir)) {
bb_perror_msg("cd: %s", newdir);
return EXIT_FAILURE;
}
update_cwd();
return EXIT_SUCCESS;
}

int chdir(const char *path)
{
return syscall(SYS_chdir, path);
}

__NR_chdir
define SYS_chdir __NR_chdir
#endif

看你用什么命令,反正 shell 是不作处理原样传给命令的。
提醒一下,cd 不在 /usr/bin

比如一个链接到目录的软链接:ln -s /test abc
ls -l abc 就是看到的 abc 这个链接本身,而 ls -l abc/ 看到的就是链接目标下面的内容。
rm abc/ 报错:rm: cannot remove 'abc/': Is a directory
rm -r abc/ 报错:rm: cannot remove 'abc/': Not a directory
这两个都报错,因为路径后面带 /,表示一个目录,rm 去删的时候需要加 -r 。然后报错的时候就返回这个链接目标的属性,是一个目录了。而加上 -r 真正去删的时候,会递归先把目标下面的文件全删掉,到删这个链接本身的时候,发现它不是一个目录,所以报错,不是一个目录。
一般后面带 / 表示目录,而不带 / 则会自动判断,得看具体软件的处理的。不同软件的行为可能不一样。

cp mv 有区别

例如?

命令加不加好像都没差,会自动识别。平时我是都有加上

cp 在不同系统下的处理不一样,所以最好明确

难道不应该是 cd 的时候,shell 会直接把你输入的路径当成了目录,而在实际切换目录的时候发现不是目录才报错吗?
简单理解就是
cp -r /path/to/name .
的时候会把整个目录复制过来带,当前目录会多一个 name 目录,而
cp -r /path/to/name/ .
的时候则会把 /path/to/name/下的文件复制到当前位置并且当前目录无 name 目录,带 /和不带 / 就是告诉系统“作用”域在哪,加上 / 就是相当于 cd 到目录下 以 ./ 的形式操作。而无论什么时候,系统都会以最后一个 /作用作用目录。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服