为什么命令 echo "$(dirname "~")" 与 echo $(dirname ~) 不同?

时间:2021-06-16 04:31:57

标签: shell

1

然后我发现

4

我认为前者只是将几个字符串合而为一并解释那个。但它有一些问题。我无法理解会发生什么。

2 个答案:

答案 0 :(得分:0)

当您将任何特殊字符或任何带有其参数的命令放在 ""(双引号)内时,它会将其视为一个完整的字符串,然后尝试进行计算。

下面的例子会更清楚:-

9

以下参考来自here(这是一个很棒的参考,请尝试了解ubuntu如何对待'"):-

<块引用>

3.1.2.2 Single Quotes

用单引号 (') 括起来的字符会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。

<块引用>

3.1.2.3 Double Quotes

用双引号 (") 括起来的字符会保留引号内所有字符的字面值,除了 $、、, 以及启用历史扩展时的 !。字符 ​​$ 和 >retain它们在双引号中的特殊含义(请参阅 Shell Expansions)。反斜杠仅在后跟以下字符之一时才保留其特殊含义:$、、"、 或换行符。在 do>uble >quotes 中,后跟这些字符之一的反斜杠被删除。没有特殊含义的字符前面的反斜杠保持不变。双引号可以通过在双引号前面加上反斜杠来引用。如果启用,将执行历史扩展,除非 !出现在双引号中的是使用反斜杠进行转义。 ! 前面的反斜杠!未被删除。>

<块引用>

特殊参数 * 和 @ 在双引号中具有特殊含义(参见 Shell Parameter Expansion)。

你的命令有什么问题

对于命令 "$(dirname "~")":- Ubuntu 将首先将 $(dirname "~") 视为一个完整的字符串并尝试计算,然后进一步分解它,ubuntu 将尝试将命令 dirname "~" 执行为 { {1}} 位于 ~ 内,它被视为单个字符串,并且由于下面解释的 "" 的愚蠢行为,它将返回 dirname,即当前工作目录

目录名的工作:-

dirname 命令的简单语法 -- .

使用带有文件绝对路径的 dirname 命令将给出目录路径:

dirname OPTION PATH

dirname 命令实际上也很愚蠢。它并不真正识别文件路径。它只是查找斜杠 (/) 并打印最后一个斜杠之前的内容。基本上,你可以给它任何带有/在里面的字符串,它会起作用。

例如,我在这里使用了一个没有文件名的随机字符串。您可以看到它仍然工作相同,并输出一个字符串,删除最后一个 / 及其后面的文本。 1

如果路径中没有斜线(/),它会输出一个点(.),表示当前目录。 2

答案 1 :(得分:0)

也许您可以通过执行 man 使用 dirname 命令获取有关 man dirname 的详细信息。

NAME
   dirname - strip last component from file name

SYNOPSIS
   dirname [OPTION] NAME...

DESCRIPTION
   Output each NAME with its last non-slash component and trailing slashes removed; 
if NAME contains no /'s, output '.' (meaning the current directory).

   -z, --zero
          end each output line with NUL, not newline

   --help display this help and exit

   --version
          output version information and exit

EXAMPLES
   dirname /usr/bin/
          -> "/usr"

   dirname dir1/str dir2/str
          -> "dir1" followed by "dir2"

   dirname stdio.h
          -> "."