快速提问,如何使用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:显然我试图在错误的目录中运行..但是感谢所有输入的人,真的学到了很多!!
答案 0 :(得分:1)
您的脚本存在许多切线问题。
/root/
中包含文件表明您正在以root
用户身份运行此文件。这是一个重要的禁忌。您根本不需要root权限(在这种情况下,以普通用户身份运行将是一个非常小的更改)或者您需要学习将特权管理任务与您经常使用系统分开(在这种情况下会有有点学习曲线,但最后你会感激自己。)#!
之后的事物应该是解释器的绝对路径(或者,视情况而定,是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)
pushd
和popd
(或简称cd
和cd -
)是选项,但是,我主要发现使用子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