我正在编写这个简单的脚本来cd到多个 文件中的文件夹,但CD无法正常工作。
我在Why doesn't "cd" work in a bash shell script?尝试过解决方案 和Shell script change directory with variable
但一切都没有用。
这是我的剧本:
cat fileName.txt | while read line; do
echo $line
line=$(echo $line | tr -d '\r')
cd "$line"
done
+ inputFile=drugs800Folders.txt
+ IFS=
+ read -r line
+ line=CID000000923
+ cd CID000000923
+ awk '$11 < 0.05 {print $1 $2 $3 $8 $10 $12}' groups.txt
+ IFS=
+ read -r line
+ line=CID000001003
+ cd CID000001003
FilterFuncOutput.sh: line 5: cd: CID000001003: No such file or directory
+ exit
@Charles Duffy 所以它工作,并为列表中的第一个文件夹的awk,但不是第一行后的剩余文件夹 第一行是否只选择列表中的第一个文件?
答案 0 :(得分:2)
除非您设置了lastpipe
shell选项(并且满足其操作的先决条件),否则bash中shell管道的所有元素都在它们自己的子shell中运行。因此,当子shell退出时,那些管道组件对shell状态的副作用就会被抛弃。
此外,编辑和评论清楚地表明,您不希望每个cd
发生在另一个之后(因此,净效果等同于cd line1dir/line2dir/line3dir/line4dir
),但都是相对于起始目录。将来,在你的初始问题中明确这种约束。
幸运的是,您根本不需要管道:
#!/bin/bash
inputFile=${1:-fileName.txt}
owd=$PWD # store original directory
while IFS= read -r line; do
line=${line%$'\r'} # remove a trailing CR if any exists
cd "$owd/$line" || continue
echo "Now in directory $PWD"
done <"$inputFile"
现在,让我们看一下具体的事情:
cat
调用(因此输出的管道导致cd
在退出循环后没有继续生效)消失了。-r
参数read
可以防止带有文字反斜杠的名称被激活。|| exit
行上使用cd
可确保您的脚本在发生故障时无法继续从错误的目录运行。echo $line
已经消失了。这不是一个准确的调试措施;如果您想查看脚本的功能,请使用bash -x yourscript
运行或添加set -x
行。BashFAQ #24详细介绍了您的根本原因。
答案 1 :(得分:1)
这对我有用
cat fileName.txt | while read line; do
echo "$line"
line="$(echo "$line" | tr -d '\r')"
echo "$line"
cd "$line"
echo "$PWD"
done
另外,只是一个shell编程技巧。 This是一个很棒的网站,用于测试shell脚本语法和常见错误,并且多次挽救了我的生命! http://www.shellcheck.net/
答案 2 :(得分:0)
无用地使用cat
创建子shell?
while read line; do
echo $line
line=$(echo $line | tr -d '\r')
cd "$line"
done < fileName.txt
可能有用。