在 unix/linux 中,路径中任意数量的连续正斜杠通常等效于单个正斜杠。例如。
$ cd /home/shum
$ pwd
/home/shum
$ cd /home//shum
$ pwd
/home/shum
$ cd /home///shum
$ pwd
/home/shum
Run Code Online (Sandbox Code Playgroud)
然而由于某种原因,绝对路径开头的两个正斜杠被特殊对待。例如。
$ cd ////home
$ pwd
/home
$ cd ///
$ pwd
/
$ cd //
$ pwd
//
$ cd home//shum
$ pwd
//home/shum
Run Code Online (Sandbox Code Playgroud)
补丁中任何其他地方的任何其他数量的连续正斜杠都会被截断,但开头的两个将保留,即使您随后在相对于它的文件系统中导航。
为什么是这样?/... 和 //... 之间有什么区别吗?
假设我在 shell 脚本中有几个变量(例如在 zsh 中):
FOLDER_1, FOLDER_2, etc.
Run Code Online (Sandbox Code Playgroud)
这些变量指的是从/
. 例如,如果我有一条路径/home/me/stuff/items
变量将是:
FOLDER_1='home'
FOLDER_2='me'
FOLDER_3='stuff'
Run Code Online (Sandbox Code Playgroud)
现在,假设我想通过连接变量来重建相应的路径。一种可能的方法是按如下方式构建路径:
PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/
Run Code Online (Sandbox Code Playgroud)
但是,假设某些变量FOLDER_i
带有尾随正斜杠,而其他变量则没有(我们不知道是哪个),例如
FOLDER_1='home'
FOLDER_2='stuff/'
FOLDER_3='items'
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何才能稳健地构建路径?(例如避免双斜线,并在需要的地方添加它们)。
我认为一种方法是/
在变量对之间添加always ,然后使用 删除任何重复项sed
,但我无法使其工作(我不确定我/
是否在 中正确处理sed
)。
另外,我是在重新发明轮子吗?(即是否有任何内置功能已经做到了这一点?)。
最后,如果变量在一个数组中,例如FOLDERS
,是否可以在不循环的情况下做到这一点?(或者,通过循环但不知道FOLDERS
数组中有多少)。
我添加了一个符号链接到当前目录ln -s . aa
。如果我执行cd aa
,然后我执行pwd
,响应是/home/sim/aa
。
但是如果我执行/bin/pwd
它会打印/home/sim
(当前目录没有改变)。
这种差异从何而来?