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