更改用于保存文件的目录并返回到旧目录

时间:2016-05-03 09:47:37

标签: bash

我编写了一个非常小的基本脚本,它比较了两个文件并将所有匹配的行写入文件。

我现在想要保证,无论您从哪个目录/工作目录运行bash脚本,该文件都存储在脚本所在的目录中。

#! /bin/bash
typeset -i count=1
typeset -i useable_counter=1
file="Fundstellen.txt"
curDir=`pwd`
wantedDir="/Users/Stephan/Documents/Schule/SYT/Skripting/bin/Uebungen"
echo `pushd ${wantedDir}`

if [ -e $file ]; then
 echo `chmod 777 ${file}`
 echo `rm ${file}`
fi

echo `touch ${file}`

while read pass; do
 pass_nr=`echo $pass | cut -d ":" -f 3`
 while read groups; do
  group_nr=`echo $groups | cut -d ":" -f 3`

  if [ "$pass_nr" = "$group_nr" ]; then
   if [ $count -gt 15 ]; then
    echo "#$useable_counter: $pass in $groups" >> $file
    useable_counter=$useable_counter+1
   fi
   count=$count+1
  fi
 done < /etc/group
done < /etc/passwd

echo `chmod 444 $file`
echo `popd`
echo "Writing done!"

我的脚本使用pushd命令进入脚本所在的目录并弹出应返回。

但是,输出文件仍然是在启动脚本的目录/ working目录中创建的。 我需要改变什么以便它能够工作?我已经尝试使用普通cd来更改目录,这就是变量curDir存储起始目录的原因。

2 个答案:

答案 0 :(得分:2)

通过将pushd放入反引号中,您将在子shell中运行它。没有子shell可以更改其父shell的当前工作目录。

致电

pushd "$wantedDir"

直接,与popd相同。

答案 1 :(得分:2)

你的剧本无可救药。在命名文件中生成输出所需的只是

command >/Users/Stephan/Documents/Schule/SYT/Skripting/bin/Uebungen/Fundstellen.txt

通常,极少数脚本需要明确cd,而更少需要pushdpopd - 这些命令几乎完全用于交互式使用。

您为group文件中的每个条目读取所有passwd文件的循环效率极低,尤其是当内循环的目的似乎只是找到一小部分时,文件中的记录。通常,当您看到while read时,您需要使用Awk。这是一个简单的框架。

awk -F : 'NR==FNR { ++p[$3]; next }
    FNR > 15 && $3 in p { print "#" ++i ": " $3 " in " $0 }' /etc/passdwd /etc/group

目前还不清楚15应该完成什么。它是您脚本中的错误,还是仅在第一次迭代时跳过前15行?