目录加“/”和不加有什么区别呀?

2020-12-07 20:38:07 +08:00
 weifan

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

5012 次点击
所在节点    Linux
17 条回复
retanoj
2020-12-07 20:41:55 +08:00
环境变量是个 key- value,加与不加要看怎么用。
cd 命令,是因为 cd 帮你做了判断
iamwho
2020-12-07 20:52:25 +08:00
rsync 中有区别
liaojl
2020-12-07 20:56:20 +08:00
加 /表示绝对路径,不加表示相对路径,cd 不加没区别是因为系统已经将 /usr/bin 加入到环境变量中去了。
lmoon
2020-12-07 21:18:09 +08:00
@liaojl 他问的是加在文件夹末尾的 / 吧,比如 /data/ /data 都可以
weifan
2020-12-07 21:24:18 +08:00
@lmoon 嗯,是的,是我没说清楚!
hazardous
2020-12-07 21:27:42 +08:00
有斜杠说明肯定是个目录,没斜杠有可能是个文件。
对 cd 来说没区别因为它后面肯定是目录,对别的命令可能有区别。
imdong
2020-12-07 21:29:14 +08:00
通常来说,后面加 / 才是文件夹,否则应该是文件。

由于文件夹和文件不能重名(好像是?),所以,加不加都可以,系统等各方面会自动识别,但是在遇到问题的时候记得有没有 / 其实是两码事。

不然这种小问题 够你头大的。
Dvel
2020-12-07 21:32:56 +08:00
自动补全的时候都加了 /
Osk
2020-12-07 21:41:27 +08:00
mv 等命令加不加后面的斜杠好像会影响行为的
cmostuor
2020-12-07 21:44:13 +08:00
自己看代码

static void update_cwd(void)
{
cwd = xrealloc_getcwd_or_warn(cwd);
if (!cwd)
cwd = xstrdup(bb_msg_unknown);
}

/* built-in 'cd <path>' 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);
}


#ifdef __NR_chdir
# define SYS_chdir __NR_chdir
#endif
no1xsyzy
2020-12-07 22:08:19 +08:00
看你用什么命令,反正 shell 是不作处理原样传给命令的。

@liaojl 提醒一下,cd 不在 /usr/bin
jinliming2
2020-12-07 22:22:56 +08:00
比如一个链接到目录的软链接: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 真正去删的时候,会递归先把目标下面的文件全删掉,到删这个链接本身的时候,发现它不是一个目录,所以报错,不是一个目录。
一般后面带 / 表示目录,而不带 / 则会自动判断,得看具体软件的处理的。不同软件的行为可能不一样。
wnpllrzodiac
2020-12-08 08:13:33 +08:00
cp mv 有区别
weifan
2020-12-08 11:00:41 +08:00
@retanoj 例如?
weifan
2020-12-08 11:01:58 +08:00
@Osk 命令加不加好像都没差,会自动识别。平时我是都有加上
hurrytospring
2020-12-08 11:30:13 +08:00
cp 在不同系统下的处理不一样,所以最好明确
tomychen
2020-12-08 15:50:28 +08:00
难道不应该是 cd 的时候,shell 会直接把你输入的路径当成了目录,而在实际切换目录的时候发现不是目录才报错吗?

简单理解就是
cp -r /path/to/name .
的时候会把整个目录复制过来带,当前目录会多一个 name 目录,而
cp -r /path/to/name/ .
的时候则会把 /path/to/name/下的文件复制到当前位置并且当前目录无 name 目录,带 /和不带 / 就是告诉系统“作用”域在哪,加上 / 就是相当于 cd 到目录下 以 ./ 的形式操作。而无论什么时候,系统都会以最后一个 /作用作用目录。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/733091

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX