如何在单独的目录中运行文件?击

时间:2018-04-03 05:40:17

标签: bash shell

快速提问,如何使用bash脚本在另一个目录中运行文件?

到目前为止,我有:

#!/bin/#!/usr/bin/env bash
counter=0
while [ "$counter" -le 208 ]
do
     mv $counter.txt /root/Assignment3_submission/query

     # MUST RUN THE FUNCTION HERE

     mv /root/Assignment3_submission/query/$counter.txt 
        /root/Assignment3_submission/data

((counter++))
done

我的文件路径是:

Assignment3_submission
|
|--> data
|     |
|     L--> .txt files numbered 0-208
|     L--> generate_all_predictions.bash
|
|--> query
|--> movie_recommender

当我在Assignment3_submission中运行./movie_recommender时,它完美无缺。 此外,我的脚本(generate_all_predictions.bash)移动所有文本文件 数据可以完美地查询和返回。

我只需要在bash脚本中运行这个movie_recommender文件,该脚本位于/ Assignment3_submission / data

编辑:我试过这行代替#MUST RUN HERE并获得200多个seg错误

/root/Assignment3_submission/movie_recommender query/$counter.txt data/*

EDIT2:显然我试图在错误的目录中运行..但是感谢所有输入的人,真的学到了很多!!

4 个答案:

答案 0 :(得分:1)

您的脚本存在许多切线问题。

  • /root/中包含文件表明您正在以root用户身份运行此文件。这是一个重要的禁忌。您根本不需要root权限(在这种情况下,以普通用户身份运行将是一个非常小的更改)或者您需要学习将特权管理任务与您经常使用系统分开(在这种情况下会有有点学习曲线,但最后你会感激自己。)
  • 硬编码路径使您的脚本无法重复使用。您应该重新设计它,以便它可以工作,无论您在哪个目录中,无论它应该在哪个数据文件上运行。您可以让它接受路径名参数,或者只是在假设调用它的用户理解此约定的情况下在当前工作目录中操作。
  • 你的shebang系列非常困惑。 #!之后的事物应该是解释器的绝对路径(或者,视情况而定,是env这样的程序,它为你找出解释器的绝对路径)。

也许是这样的。

#!/bin/bash

test -d ./query && test -d ./data ||
{ echo "$0: ./query and ./data must exist" >&2
  exit 1; }

for((counter=0; counter <= 208; ++counter))
do
    mv ./data/"$counter.txt" ./query

    ./movie_recommender query/"$counter.txt" data/*

     mv ./query/"$counter.txt" ./data

done

答案 1 :(得分:0)

您可以轻松使用

cd ..
  execute stuff
cd -

或甚至更通用(也允许进一步嵌套):

pushd ..
 execute stuff (even containing further pushd ... popd)
popd

答案 2 :(得分:0)

到处使用绝对地址:

/root/Assignment3_submission/movie_recommender /root/Assignment3_submission/query/$counter.txt /root/Assignment3_submission/data/* 

答案 3 :(得分:0)

pushdpopd(或简称cdcd -)是选项,但是,我主要发现使用子shell更容易:

(
  cd /path/to/run/stuff/in
  # stuff to do here
)

一旦子shell退出,主shell仍然在原始位置。 (这也意味着如果它被中断,工作目录不会改变)

对于这个例子:

#!/bin/bash
counter=0
while [ "$counter" -le 208 ]
do
     mv $counter.txt ~/Assignment3_submission/query

     # Stuff to do in other PWD
     (
         cd ~"/Assignment3_submission/query"
         tar czf ~/things_in_dir_using_relative_paths.tar.gz * # Sample command

     )

     mv ~/Assignment3_submission/query/$counter.txt 
        ~/Assignment3_submission/data

((counter++))
done