use*_*666 0 unix linux bash scripting cd
当我cd在bash命令中使用命令时,我只是好奇
cd foobar
Run Code Online (Sandbox Code Playgroud)
和
cd ./foobar
Run Code Online (Sandbox Code Playgroud)
以同样的方式工作.我明白,./指的是当前的目录目录,但为什么" cd foobar"工作呢?它只是默认,当我不是./在开头写时,程序自己添加它,还是更复杂?
cdbash中的命令(有点间接地,如下所述)调用chdir()syscall,其行为由POSIX指定.所述cd壳COMAND本身也有一个POSIX规范其行为,在或许更详细地比是适当的用于存取/可读的定义.
是的,所有操作的默认(不仅是chdir()也fopen()和其他人)是当前工作目录.
这不是特定于bash,而是操作系统级行为:"当前工作目录"是关于内核跟踪的每个进程的元数据的一部分,并影响对内核的文件系统级请求:任何程序,任何语言,可以调用chdir("foo")或open("foo", O_RDONLY),并且行为将foo在当前目录中查找,从父进程继承或使用先前chdir()调用进行修改.
也就是说,出于bash的目的,cd ./foo它更具体而不仅仅是cd foo:前者表示您明确需要foo当前工作目录的子目录.在bash中,如果CDPATH设置了shell变量,那么cd foo将查看其中列出的所有目录,而cd ./foo显式只foo在当前工作目录下请求.
试试这个实验:
# setup
tempdir=$(mkdir -d "${TMPDIR:-/tmp}/cdpath-test.XXXXXX")
mkdir -p "$tmpdir/i-am-a-test-directory"
CDPATH=".:$tempdir"
# this works, because CDPATH is honored
cd /
cd i-am-a-test-directory
# this does not, because you're explicitly asking for a directory that does not exist
cd /
cd ./i-am-a-test-directory
# cleanup
rm -rf "$tempdir"
unset CDPATH
Run Code Online (Sandbox Code Playgroud)