首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash提示符中引用目录名

问在bash提示符中引用目录名
EN

Unix & Linux用户
提问于 2019-09-24 15:44:50
回答 2查看 433关注 0票数 0

我想在我的提示符中引用当前目录。

如果我这样做了:

代码语言:javascript
复制
mkdir 我希望我的提示符显示,而不是打印文字换行符。我看到一些有趣的行为试图在bash 5.0.9中打印反斜杠(D3):p='\\n'       && echo -E "${p@P}"  # 2 slashes; output = '\n'
p='\\\\n'     && echo -E "${p@P}"  # 4 slashes; output = '\n'
p='\\\\\\n'   && echo -E "${p@P}"  # 6 slashes; output = '\\n'
p='\\\\\\\\n' && echo -E "${p@P}"  # 8 slashes; output = '\\n'注:${parameter@P}的值展开的结果。parameter好像这是一个提示为什么输出与(2和4)、(6和8)斜线等价?鉴于这种混乱,和:mkdir '\\n' && cd '\\n'我无法解决如何以编程方式将\\n转换为字符串,以便在提示符中显示为:\\\\n或,以及处理文字换行符。如何在提示符中引用目录名,以便:~显示为$HOME,前导~/用于子目录。只有在需要时才会转义其他路径。显示的字符串的复制粘贴是引用当前目录的有效shell令牌。例如,"$HOME/dir with spaces"应显示为:~/dir\ with\ spaces~/~/'dir with spaces'new\nline'; cd 我希望我的提示符显示D1,而不是打印文字换行符。我看到一些有趣的行为试图在D3中打印反斜杠(D3):A4注:C5为什么输出与(2和4)、(6和8)斜线等价?鉴于这种混乱,和:A6我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。如何在提示符中引用目录名,以便:F110H111D12显示为D13,前导D14用于子目录。H215H116只有在需要时才会转义其他路径。H217H118显示的字符串的复制粘贴是引用当前目录的有效shell令牌。H219F220例如,D21应显示为:F122H123D24H225H126D27H228H129D30H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline',而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232\\\\n',以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline',而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232dir with spaces'H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline',而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232\\\\n',以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline',而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'; cd

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232new\nline'

我希望我的提示符显示D1,而不是打印文字换行符。

我看到一些有趣的行为试图在D3中打印反斜杠(D3):

A4

注:C5

为什么输出与(2和4)、(6和8)斜线等价?

鉴于这种混乱,和:

A6

我无法解决如何以编程方式将D7转换为字符串,以便在提示符中显示为:D8或D9,以及处理文字换行符。

如何在提示符中引用目录名,以便:

F110H111

D12显示为D13,前导D14用于子目录。

H215H116

只有在需要时才会转义其他路径。

H217H118

显示的字符串的复制粘贴是引用当前目录的有效shell令牌。

H219F220

例如,D21应显示为:

F122H123

D24

H225H126

D27

H228H129

D30

H231F232

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-09-24 16:21:31

如果我在提示符中包括\w,在提示符中包含cd ,那么Bash只显示提示符中的/tmp/newline。它似乎不打印文字换行符,但这也不是一个明确的输出格式。

${var@P}的目的是扩展提示符式转义,比如用户名的\u、主机名的\h和工作目录的\w,我怀疑您在这里是否需要这些。相反,引用输出的${var@Q}可能更有用吗?

设置PS1='${PWD@Q}\$ '时,如果路径更好,我将得到提示符:或'/tmp'$。另一种选择可能是PS1='$(printf "%q" "$PWD")\$ ',它在某些情况下给出了不同的引用,例如,在“好”路径的情况下不引用引号,所以/tmp$。

要将主目录显示为一个倾斜目录,一种选择是手动进行替换:

代码语言:javascript
复制
set_ppath() {
    printf -v ppath "%q" "$PWD"
    ppath="${ppath/$HOME/"~"}";
}
PROMPT_COMMAND=set_ppath
PS1='$ppath\$ '

但是,如果其中的一部分需要引用,它仍然引用整个路径。为了解决这个问题,我想你必须一片片地走在这条路上。

不过,我不知道为什么${var@P}会像这样折叠反斜杠。

/tmp/new\nline',那么Bash只显示提示符中的D2。它似乎不打印文字换行符,但这也不是一个明确的输出格式。

D3的目的是扩展提示符式转义,比如用户名的D4、主机名的D5和工作目录的D6,我怀疑您在这里是否需要这些。相反,引用输出的D7可能更有用吗?

设置D8时,如果路径更好,我将得到提示符:D9或D10。另一种选择可能是D11,它在某些情况下给出了不同的引用,例如,在“好”路径的情况下不引用引号,所以D12。

要将主目录显示为一个倾斜目录,一种选择是手动进行替换:

A13

但是,如果其中的一部分需要引用,它仍然引用整个路径。为了解决这个问题,我想你必须一片片地走在这条路上。

不过,我不知道为什么D14会像这样折叠反斜杠。

/tmp/new\nline'$或D10。另一种选择可能是D11,它在某些情况下给出了不同的引用,例如,在“好”路径的情况下不引用引号,所以D12。

要将主目录显示为一个倾斜目录,一种选择是手动进行替换:

A13

但是,如果其中的一部分需要引用,它仍然引用整个路径。为了解决这个问题,我想你必须一片片地走在这条路上。

不过,我不知道为什么D14会像这样折叠反斜杠。

/tmp/new\nline',那么Bash只显示提示符中的D2。它似乎不打印文字换行符,但这也不是一个明确的输出格式。

D3的目的是扩展提示符式转义,比如用户名的D4、主机名的D5和工作目录的D6,我怀疑您在这里是否需要这些。相反,引用输出的D7可能更有用吗?

设置D8时,如果路径更好,我将得到提示符:D9或D10。另一种选择可能是D11,它在某些情况下给出了不同的引用,例如,在“好”路径的情况下不引用引号,所以D12。

要将主目录显示为一个倾斜目录,一种选择是手动进行替换:

A13

但是,如果其中的一部分需要引用,它仍然引用整个路径。为了解决这个问题,我想你必须一片片地走在这条路上。

不过,我不知道为什么D14会像这样折叠反斜杠。

票数 2
EN

Unix & Linux用户

发布于 2019-09-25 10:07:20

基于伊尔卡丘的回答,我想出如下结论:

代码语言:javascript
复制
PROMPT_COMMAND=_prompt_bash_set

_prompt_bash_set() {
  # Working directory
  local prefix=''  # Used to contain '~' if $PWD directory is under $HOME
  local dir=$PWD

  # Replace leading $HOME with ~ if at beginning of string
  case "$PWD"/ in # Extra slash at end prevents substring match
    "$HOME"/)  # $PWD == $HOME itself
      prefix=\~  # no trailing /
      dir='' ;;
    "$HOME"/?*)  # $PWD is a subdir of $HOME
      prefix=\~/  # Add trailing / so that possibly quoted string goes after ~/ for path validity
      dir=${PWD#$HOME/} ;;   # Remove $HOME and / as this is now in $prefix
  esac

  if [[ $PWD != $HOME ]]; then  # $PWD != $HOME
    # Avoid ${PWD@Q} as it produced a literal \n inside 它将引用的目录作为$PS1中的文字文本,而不是通过变量包含。这样做的好处是,我可以继续使用目录中的彩色斜线,我的眼睛发现它更容易解析。'
    printf -v dir '%q' "$dir"  # Quote directory minus $HOME

    # Replace a single slash with 4!?! slashes
    # https://unix.stackexchange.com/q/543473/143394
    dir=${dir//\\/\\\\\\\\}

    # Prevent command and variable substitution:
    dir=${dir//\`/\\\`}  # escape ` as \`
    dir=${dir//\$/\\\$}  # escape $ as \$
  fi

  PS1='\u@\h:'$dir'\$ '
}

它将引用的目录作为D1中的文字文本,而不是通过变量包含。

这样做的好处是,我可以继续使用C2,我的眼睛发现它更容易解析。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/543473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档