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

Linux Bash脚本:当文件存在时,没有这样的文件或目录,linux,bash,shell,cd,Linux,Bash,Shell,Cd,我的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 director

我的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 serata'
,一切都很好。bash脚本的源目录是否可能与其所在的源目录不同?

如果要在相对路径中循环,请尝试包含绝对路径,例如:

#!/bin/bash

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

在相对路径中循环,请尝试包含绝对路径,例如:

#!/bin/bash

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

问题是当前目录是“state”,在循环的每个过程中都会被修改,为了使用发布的命令,不应该通过过程更改cwd状态

生成子shell可以解决这种状态变化的问题。子shell继承其父级的状态,但不影响父级

do(command;command;…;)
将在每个循环过程中生成一个新的shell

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

问题是当前目录是“state”,在循环的每个过程中都会被修改,为了使用发布的命令,不应该通过过程更改cwd状态

生成子shell可以解决这种状态变化的问题。子shell继承其父级的状态,但不影响父级

do(command;command;…;)
将在每个循环过程中生成一个新的shell

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

~$ find /full/path/to/dir -maxdepth 1 -type d -printo | xargs -0 -I% sh -c "cd %; echo "do some fun here""
如果有空格,您将避免名称拆分。

具有防弹功能

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

如果有空格,您将避免名称拆分。

在使用Linux时,我倾向于尽可能避免文件名和目录名中包含空格。CamelCase或under_score几乎同样容易阅读,更常见,更安全。@Paul:绝对同意!不幸的是,我没有设计它的结构,因为我继承了
cd$target
之前的codeAdd
pwd
,看看这是否揭示了什么有趣的东西……在使用Linux时,我倾向于尽可能避免文件名和目录名中带有空格。CamelCase或under_score几乎同样容易阅读,更常见,更安全。@Paul:绝对同意!不幸的是,我没有设计它的结构,因为我继承了
cd$target
之前的codeAdd
pwd
,看看这是否揭示了什么有趣的东西。。。