读取循环时cd不能在bash中工作

时间:2016-02-05 20:49:22

标签: bash shell cd

我正在编写这个简单的脚本来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,但不是第一行后的剩余文件夹 第一行是否只选择列表中的第一个文件?

3 个答案:

答案 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在退出循环后没有继续生效)消失了。
  • 清除IFS允许以空格结尾的名称通过未修改的名称传递。
  • 使用-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

可能有用。