我正在编写一个脚本来编译代码.这些来源位于许多不同的目录中.我将发布源代码,我希望它可以被许多其他人编译.因此在我的脚本中我使用相对路径.
如果有人在他的机器上运行脚本,则从脚本所在的目录中运行,就像./script一切正常.但是,如果脚本是从另一个目录运行的,./path/to/script那么路径不正确并且脚本不起作用.
我怎么能克服这个?
我在三个不同的同级目录中有三个bash脚本。
每一行的前几行进行一些设置,各行之间有所不同。
脚本的最后二十行左右是相同字符,用于处理和比较在第一位中构造的文件。
我想做的是将最后20行输入,然后说../common.bash,做类似的事情
#include "../common.bash"
Run Code Online (Sandbox Code Playgroud)
在这三个脚本中分别使用,以避免每次我摆弄时都必须在三个地方进行相同的更改。
到目前为止,我最好的猜测是使用cat从四个道德独立的片段中构建脚本。
有没有更好的办法?
我有一个运行jar文件的小脚本:
#!/bin/bash
prefix="foo";
name=`ls ${prefix}*.jar`;
echo $name;
java -jar $name prop1.properties prop2.properties
Run Code Online (Sandbox Code Playgroud)
当我使用./myscript.sh在终端中运行它时,它工作正常并且jar文件执行,但是当我在myscript.command中重命名并双击它时,我有这个错误:
ls: foo*.jar : No such file or directory
Run Code Online (Sandbox Code Playgroud)
我看到显然.command文件在根目录下打开一个终端,所以我尝试使用它找到包含myscript.command的目录:
dir = 'find <dir> -maxdepth 1 -type d -name '*myDirContainingJar*' -print -quit'
cd $dir
Run Code Online (Sandbox Code Playgroud)
但是dir只是空白,任何想法???
背景
我有一个Python应用程序,它依赖于另一个作为git子模块提供的包,产生类似于以下内容的目录结构:
foo/
bar/
bar/
__init__.py
eggs.py
test/
setup.py
foo/
__init__.py
ham.py
main.py
Run Code Online (Sandbox Code Playgroud)
从顶层目录执行该访问foo包就足够简单了。但是该程序包嵌套在另一个目录中,不能直接导入。main.pyfoo/barbar
通过sys.path在以下内容的开头进行修改,可以轻松解决此问题main.py:
import sys
# Or sys.path.append()
sys.path.insert(0, './bar')
from bar.eggs import Eggs
from foo.ham import Ham
Run Code Online (Sandbox Code Playgroud)
(注意:此代码示例假定main.py将始终从中调用foo/;如果情况并非如此,则'.bar'可以将其替换,os.path.join(os.path.dirname(__file__), 'bar')尽管这样做显然比较麻烦。)
问题
不幸的是,pylint不喜欢这种解决方案。当代码工作时,lint认为sys.path修改是结束于“模块顶部”的代码块,并给出了不希望的wrong-import-position警告:
C: 6, 0: Import "from bar.eggs import Eggs" should be placed at the top of the module (wrong-import-position)
C: 7, 0: Import "from foo.ham …Run Code Online (Sandbox Code Playgroud) 注意:我非常努力地确保这不是重复的,并且没有问过这个问题bash。据我所知,它不是重复的。
因为我对这样做的所有方式都感兴趣,并且由于git我的 OP 中强调这是一个回购,所以我不会要求答案仅使用 SHELL BUILTIN 命令,但会优先考虑仅使用的答案shell 内置函数。
我在问题中包含的脚本是我使用纯 shell 脚本回答问题的最佳尝试。
我有一个目录结构复杂的大型 bash 项目。让我们bash先把我为什么选择的问题放在一边,而不是像python.
我git用于对项目进行版本控制,该项目应该能够在用户空间的任何位置分发和安装并正常运行。因此,我有以下要求:
我希望能够将各种脚本移动到不同的目录中,而不会破坏或改变它们的运行方式。在这种情况下,可以修改脚本的执行方式(例如,通过使用其他脚本中正确的更新路径),但是在将脚本移动到新目录后,不必重写脚本的内部结构,以确保它继续工作。
我希望每个脚本都source来自vars.sh项目根目录中的一个文件中的重要变量,这样如果我决定更改项目的目录结构,我就不必在每个脚本中编辑这些变量。因此,每个脚本都需要知道项目根目录在哪里。
此类变量的示例:包含项目内目录config绝对路径或目录绝对路径等的变量tmp)。这将是确定要重新写vars.sh,如果目录结构被改变,当然,本身。但我们的想法是只需要重写vars.sh(如果脚本被移动,则适当地调用脚本)。
git,“项目根”可以定义为git的项目树根,即有目录的.git目录。据我所知,要求2任何脚本source变量和/或函数本身都需要回答这篇文章的主要问题。根据我的经验,source使用相对路径名的命令,例如
source "../../vars.sh"
Run Code Online (Sandbox Code Playgroud)
产生一个错误“没有这样的文件或目录”中bash,并侵犯了我的假设2和要求1。
请注意,DIR通过查找脚本目录的绝对路径创建的变量,使用
DIR="$( cd …Run Code Online (Sandbox Code Playgroud) 我有几十个脚本,都在不同的目录中.(导出/扩展的Talend工作)
此时每个作业都有1或2个脚本,从相同的行开始,最重要的一行:
CD ***path-to-script***
Run Code Online (Sandbox Code Playgroud)
和几行来设置Java路径并启动作业.
我想创建一个脚本,它将从所有这些脚本运行.例如:
/scripts/talend.sh
Run Code Online (Sandbox Code Playgroud)
在所有talend脚本中,第一行将运行/scripts/talend.sh,这些脚本的运行位置的一些示例:
/talend-job1_0.1/talend-job1_0.1/talend-job1/talend-job1.sh
/talend-task2_0.1/talend-task2_0.1/talend-task2/talend-task2.sh
/talend-job3_0.1/talend-job3_0.1/talend-job3/talend-job3.sh
Run Code Online (Sandbox Code Playgroud)
如何确定/scripts/talend.sh从何处开始,因此我可以从内部CD到该路径/scripts/talend.sh.
Talend脚本不是从目录本身运行,而是从cronjob或不同的用户主目录运行.
编辑:问题被标记为重复,但从内部获取Bash脚本的源目录不是100%回答我的问题.问题是: - 从不同的脚本调用基本脚本 - 这些不同的脚本可以从命令行运行,带有或不带符号链接. - $ 0,$ BASH_SOURCE和pwd都做了一些事情,但没有提到的解决方案涵盖了所有的困难.
例:
/scripts/talend.sh
Run Code Online (Sandbox Code Playgroud)
在这个脚本中,我想配置Java的$ PATH和$ HOME_PATH,并将CD配置到Talend作业所在的位置.(它是一个包,所以脚本必须从该位置运行).
例如,工作路径是:
/u/talend/talendjob1/sub../../talendjob1.sh
/u/talend/talendjob2/sub../../talendjob2.sh
/u/talend/talendjob3/sub../../talendjob3.sh
Run Code Online (Sandbox Code Playgroud)
从TMS应用程序运行多个作业.此应用程序无法使用whol名称运行这些脚本(对于long,名称只能是6长),因此在不同的位置我有符号链接:
/u/tms/links/p00001 -> /u/talend/talendjob1/sub../../talendjob1.sh
/u/tms/links/p00002 -> /u/talend/talendjob1/sub../../talendjob2.sh
/u/tms/links/p00003 -> /u/talend/talendjob1/sub../../talendjob3.sh
/u/tms/links/p00004 -> /u/talend/talendjob1/sub../../talendjob4.sh
Run Code Online (Sandbox Code Playgroud)
我想你会对复杂性进行概述,为什么我只想要一个基本的talend脚本,在那里我可以留下所有基本内容.但我只能这样做,如果我知道Talend脚本的来源,因为我必须要开始那个talend工作.
我已经为此苦苦挣扎了一段时间,我不知道自己在做什么错。我试图在容器内运行Shell脚本,并且该Shell脚本从Shell脚本所在的目录中读取python脚本。但是我收到这个错误,说“ python:无法打开文件'get_gene_length_filter.py':[错误2]没有这样的文件或目录”。
这是我的Dockerfile:
FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y g++ \
make \
git \
zlib1g-dev \
python \
wget \
curl \
python-matplotlib \
python-numpy \
python-pandas
ENV BINPATH /usr/bin
ENV EVO2GIT https://upendra_35@bitbucket.org/upendra_35/evolinc_docker.git
RUN git clone $EVO2GIT
WORKDIR /evolinc_docker
RUN chmod +x evolinc-part-I.sh && cp evolinc-part-I.sh $BINPATH
RUN wget -O- http://cole-trapnell-lab.github.io/cufflinks/assets/downloads/cufflinks-2.2.1.Linux_x86_64.tar.gz | tar xzvf -
RUN wget -O- https://github.com/TransDecoder/TransDecoder/archive/2.0.1.tar.gz | tar xzvf -
ENV PATH /evolinc_docker/cufflinks-2.2.1.Linux_x86_64/:$PATH
ENV PATH /evolinc_docker/TransDecoder-2.0.1/:$PATH
ENTRYPOINT ["/usr/bin/evolinc-part-I.sh"]
CMD ["-h"]
Run Code Online (Sandbox Code Playgroud)
这是我的git repo代码:
#!/bin/bash …Run Code Online (Sandbox Code Playgroud) 我在 Zookeeper 中看到了这个 shell 脚本zkClear.sh。
ZOOBIN="${BASH_SOURCE-$0}"
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这个脚本的含义?谢谢。
我有以下目录和子目录结构:
\neva tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1061\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 2022\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 09\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 21\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 a0e51f58-5057-4002-b4c4-d3fb870e9b3a.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1769\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 2022\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 08\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 30\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 e36d8e21-5184-489f-89b5-eb1fd5eba5f6.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1991\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 2022\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 09\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 16\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 1d0a4162-7e66-44c8-8b61-f3bc5dbdb107.json\nRun Code Online (Sandbox Code Playgroud)\n我需要将所有 .json 文件移至根文件夹eva。
预期输出:
\n.\n\xe2\x94\x82a0e51f58-5057-4002-b4c4-d3fb870e9b3a.json\n\xe2\x94\x82e36d8e21-5184-489f-89b5-eb1fd5eba5f6.json\n\xe2\x94\x821d0a4162-7e66-44c8-8b61-f3bc5dbdb107.json\n\nRun Code Online (Sandbox Code Playgroud)\n我该如何使用 bash 来做到这一点?
\n我想在Linux中运行一个java程序并将其工作目录更改为特定位置。我对 Linux 有点菜鸟,所以我需要很多帮助。我设法弄清楚了这一点:
java -jar program.jar
Run Code Online (Sandbox Code Playgroud)
这将在它选择的工作目录中运行该程序。现在我需要找到一种方法来更改工作目录。我认为这台计算机正在运行 UBuntu(或者无论你如何拼写),但我不确定。我运行的帐户的权限也受到严格限制。
如果有人能够解释我这部分代码的作用,我会很高兴的
[ -n "${0%/*}" ] && cd ${0%/*}
. ./environment.sh
. ./readParams.sh
Run Code Online (Sandbox Code Playgroud)
我知道这个脚本是从./enviroment.sh和读取的./readparams.sh
但我真的很难理解代码的第一行是什么.所以我可以理解这之后的整个过程.
如果你能给我一个网站或任何能帮助我理解这种语法的东西,我会很高兴的.我是shell脚本的初学者,所以任何帮助都表示赞赏.
我有一个 bash 脚本,在my-script.sh从根目录向上 2 层的文件夹中调用,我希望从该文件夹中调用/执行该脚本
/folder1
/folder2/
- my-script.sh
- do-it.sh
Run Code Online (Sandbox Code Playgroud)
我的脚本.sh
#!/bin/bash
./do-it.sh
Run Code Online (Sandbox Code Playgroud)
如果我从根文件夹执行,它会失败,因为它尝试在同一文件夹中my-script.sh查找。do-it.sh
folder1/folder2/my-script.sh: line 3: ./do-it.sh: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果我想正确执行 my-script.sh 脚本,我必须先进入folder2,然后他们执行它
cd /folder1/folder2
./my-script.sh
Run Code Online (Sandbox Code Playgroud)
有没有办法从根文件夹执行它,因为它是从folder2执行的?