V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
weifan
V2EX  ›  Linux

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

  •  
  •   weifan · 2020-12-07 20:38:07 +08:00 · 5151 次点击
    这是一个创建于 1449 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    不然这种小问题 够你头大的。
    Dvel
        8
    Dvel  
       2020-12-07 21:32:56 +08:00
    自动补全的时候都加了 /
    Osk
        9
    Osk  
       2020-12-07 21:41:27 +08:00 via Android
    mv 等命令加不加后面的斜杠好像会影响行为的
    cmostuor
        10
    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
        11
    no1xsyzy  
       2020-12-07 22:08:19 +08:00
    看你用什么命令,反正 shell 是不作处理原样传给命令的。

    @liaojl 提醒一下,cd 不在 /usr/bin
    jinliming2
        12
    jinliming2  
       2020-12-07 22:22:56 +08:00   ❤️ 1
    比如一个链接到目录的软链接: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
        13
    wnpllrzodiac  
       2020-12-08 08:13:33 +08:00 via Android   ❤️ 1
    cp mv 有区别
    weifan
        14
    weifan  
    OP
       2020-12-08 11:00:41 +08:00
    @retanoj 例如?
    weifan
        15
    weifan  
    OP
       2020-12-08 11:01:58 +08:00
    @Osk 命令加不加好像都没差,会自动识别。平时我是都有加上
    hurrytospring
        16
    hurrytospring  
       2020-12-08 11:30:13 +08:00
    cp 在不同系统下的处理不一样,所以最好明确
    tomychen
        17
    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 到目录下 以 ./ 的形式操作。而无论什么时候,系统都会以最后一个 /作用作用目录。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1078 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:45 · PVG 06:45 · LAX 14:45 · JFK 17:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.