shell Bash脚本:cd当文件存在时没有这样的文件或目录

b0zn9rqh  于 2023-06-24  发布在  Shell
关注(0)|答案(4)|浏览(254)

我的bash脚本被编写为转到当前目录中的每个子文件夹:

for d in */; 
do
    target=${d%/}
    cd "$target"
done

当我运行我的bash脚本时,我得到了一个存在的目录的cd错误:

++ for d in '*/'
++ target='Zelkova serrata'
++ cd 'Zelkova serrata'
./script7.sh: line 8: cd: Zelkova serrata: No such file or directory

然而,在终端命令行中,我可以在与脚本相同的目录中执行cd 'Zelkova serrata',一切都很好。bash脚本是否可能有一个与其所在目录不同的源目录?

vwhgwdsa

vwhgwdsa1#

您正在遍历相对路径,请尝试包含绝对路径,例如:

#!/bin/bash

pwd=$PWD
for d in */; 
do
    target="$pwd/${d%/}"
    cd "$target"
    echo $PWD
done
1yjd4xko

1yjd4xko2#

问题是当前目录是“state”,它在循环的每一次传递中都被修改,并且为了使用发布的命令,cwd状态不应该被传递改变。
生成一个子shell可以解决这个状态变化的问题。子shell继承其父级的状态,但不影响父级。
do ( command; command ; ...; )将在每次循环传递时生成一个新的shell。

for d in */; 
do (
  target=${d%/}
  cd "$target"
) done
gab6jxml

gab6jxml3#

有防弹功能

~$ find /full/path/to/dir -maxdepth 1 -type d -printo | xargs -0 -I% sh -c "cd %; echo "do some fun here""

如果那里有任何空间,您将避免名称拆分。

7uhlpewt

7uhlpewt4#

要了解发生了什么,请尝试以下操作并仔细检查输出:

mkdir -p A/B/C B C D

echo Trying sequence: */
pwd
for d in */ ; do
    cd "$d"
    pwd
done

也许你想要的是:

mkdir -p A/B/C B C D

exec 3<. ; orig_dir=/proc/$$/fd/3

echo Trying sequence: */
pwd
for d in */ ; do
    cd -P "$orig_dir/$d"
    pwd
done
cd -P "$orig_dir"
pwd

或者如果exec 3<.在您的shell中不工作:

mkdir -p A/B/C B C D

orig_dir=$PWD

echo Trying sequence: */
pwd
for d in */ ; do
    cd -P "$orig_dir/$d"
    pwd
done
cd -P "$orig_dir"
pwd

相关问题