Bash script: cd 当文件存在时没有那个文件或目录
Bash script: cd No such file or directory when file exists
我的 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 脚本是否有可能与其所在的源目录不同?
您正在通过相对路径循环,请尝试包括绝对路径,例如:
#!/bin/bash
pwd=$PWD
for d in */;
do
target="$pwd/${d%/}"
cd "$target"
echo $PWD
done
问题是当前目录是 "state",在循环的每一遍都被修改并且要使用发布的命令,cwd 状态不应该被一个遍更改。
生成一个子shell可以解决这个变异状态的问题。 subshell 继承其父级的状态,但不影响父级。
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""
如果那里有 space,您将避免名称拆分。
我的 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 脚本是否有可能与其所在的源目录不同?
您正在通过相对路径循环,请尝试包括绝对路径,例如:
#!/bin/bash
pwd=$PWD
for d in */;
do
target="$pwd/${d%/}"
cd "$target"
echo $PWD
done
问题是当前目录是 "state",在循环的每一遍都被修改并且要使用发布的命令,cwd 状态不应该被一个遍更改。
生成一个子shell可以解决这个变异状态的问题。 subshell 继承其父级的状态,但不影响父级。
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""
如果那里有 space,您将避免名称拆分。