相关疑难解决方法(0)

使用另一个目录的相对路径运行脚本

我正在编写一个脚本来编译代码.这些来源位于许多不同的目录中.我将发布源代码,我希望它可以被许多其他人编译.因此在我的脚本中我使用相对路径.
如果有人在他的机器上运行脚本,则从脚本所在的目录中运行,就像./script一切正常.但是,如果脚本是从另一个目录运行的,./path/to/script那么路径不正确并且脚本不起作用.
我怎么能克服这个?

linux bash relative-path

3
推荐指数
1
解决办法
3075
查看次数

如何抽象三个bash脚本之间的通用代码?

我在三个不同的同级目录中有三个bash脚本。

每一行的前几行进行一些设置,各行之间有所不同。

脚本的最后二十行左右是相同字符,用于处理和比较在第一位中构造的文件。

我想做的是将最后20行输入,然后说../common.bash,做类似的事情

#include "../common.bash" 
Run Code Online (Sandbox Code Playgroud)

在这三个脚本中分别使用,以避免每次我摆弄时都必须在三个地方进行相同的更改。

到目前为止,我最好的猜测是使用cat从四个道德独立的片段中构建脚本。

有没有更好的办法?

bash scripting

3
推荐指数
1
解决办法
263
查看次数

双击Mac上的shell脚本

我有一个运行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只是空白,任何想法???

macos shell

3
推荐指数
1
解决办法
892
查看次数

从子模块导入Python软件包时避免pylint抱怨

背景

我有一个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)

python conventions pylint python-import git-submodules

3
推荐指数
1
解决办法
4805
查看次数

项目根目录的第N个子目录中的bash脚本如何可靠地知道项目根目录的绝对路径?

注意:我非常努力地确保这不是重复的,并且没有问过这个问题bash。据我所知,它不是重复的。

因为我对这样做的所有方式都感兴趣,并且由于git我的 OP 中强调这是一个回购,所以我不会要求答案仅使用 SHELL BUILTIN 命令,但会优先考虑仅使用的答案shell 内置函数。

我在问题中包含的脚本是我使用纯 shell 脚本回答问题的最佳尝试。

语境

我有一个目录结构复杂的大型 bash 项目。让我们bash先把我为什么选择的问题放在一边,而不是像python.

我git用于对项目进行版本控制,该项目应该能够在用户空间的任何位置分发和安装并正常运行。因此,我有以下要求:

要求

  1. 我希望能够将各种脚本移动到不同的目录中,而不会破坏或改变它们的运行方式。在这种情况下,可以修改脚本的执行方式(例如,通过使用其他脚本中正确的更新路径),但是在将脚本移动到新目录后,不必重写脚本的内部结构,以确保它继续工作。

  2. 我希望每个脚本都source来自vars.sh项目根目录中的一个文件中的重要变量,这样如果我决定更改项目的目录结构,我就不必在每个脚本中编辑这些变量。因此,每个脚本都需要知道项目根目录在哪里。

此类变量的示例:包含项目内目录config绝对路径或目录绝对路径等的变量tmp)。这将是确定要重新写vars.sh,如果目录结构被改变,当然,本身。但我们的想法是只需要重写vars.sh(如果脚本被移动,则适当地调用脚本)。

假设

  1. 我在用git,“项目根”可以定义为git的项目树根,即有目录的.git目录。
  2. 在脚本中,任何脚本都不需要被告知它有多少个子目录。

讨论和提议的解决方案

据我所知,要求2任何脚本source变量和/或函数本身都需要回答这篇文章的主要问题。根据我的经验,source使用相对路径名的命令,例如

source "../../vars.sh"
Run Code Online (Sandbox Code Playgroud)

产生一个错误“没有这样的文件或目录”中bash,并侵犯了我的假设2和要求1。

请注意,DIR通过查找脚本目录的绝对路径创建的变量,使用

DIR="$( cd …
Run Code Online (Sandbox Code Playgroud)

git directory bash shell

2
推荐指数
1
解决办法
181
查看次数

在bash中将目录更改为父/调用脚本的路径

我有几十个脚本,都在不同的目录中.(导出/扩展的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工作.

linux bash shell talend

1
推荐指数
1
解决办法
1377
查看次数

当我尝试在Docker容器中运行Shell脚本时无法打开文件

我已经为此苦苦挣扎了一段时间,我不知道自己在做什么错。我试图在容器内运行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)

python shell docker

1
推荐指数
1
解决办法
3378
查看次数

${BASH_SOURCE-$0} 的含义?

我在 Zookeeper 中看到了这个 shell 脚本zkClear.sh。

ZOOBIN="${BASH_SOURCE-$0}"
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这个脚本的含义?谢谢。

bash

1
推荐指数
1
解决办法
2721
查看次数

将文件从子目录移动到根文件夹的脚本

我有以下目录和子目录结构:

\n
eva 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\n
Run Code Online (Sandbox Code Playgroud)\n

我需要将所有 .json 文件移至根文件夹eva。

\n

预期输出:

\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\n
Run Code Online (Sandbox Code Playgroud)\n

我该如何使用 bash 来做到这一点?

\n

linux bash

1
推荐指数
1
解决办法
836
查看次数

Linux更改java程序的工作目录

我想在Linux中运行一个java程序并将其工作目录更改为特定位置。我对 Linux 有点菜鸟,所以我需要很多帮助。我设法弄清楚了这一点:

java -jar program.jar
Run Code Online (Sandbox Code Playgroud)

这将在它选择的工作目录中运行该程序。现在我需要找到一种方法来更改工作目录。我认为这台计算机正在运行 UBuntu(或者无论你如何拼写),但我不确定。我运行的帐户的权限也受到严格限制。

java linux working-directory

0
推荐指数
1
解决办法
3957
查看次数

如何理解以下shell脚本?

如果有人能够解释我这部分代码的作用,我会很高兴的

[ -n "${0%/*}" ] && cd ${0%/*}
. ./environment.sh
. ./readParams.sh
Run Code Online (Sandbox Code Playgroud)

我知道这个脚本是从./enviroment.sh和读取的./readparams.sh

但我真的很难理解代码的第一行是什么.所以我可以理解这之后的整个过程.

如果你能给我一个网站或任何能帮助我理解这种语法的东西,我会很高兴的.我是shell脚本的初学者,所以任何帮助都表示赞赏.

shell

0
推荐指数
1
解决办法
103
查看次数

Bash - 运行脚本,因为它是在自己的文件夹中执行的

我有一个 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执行的?

linux bash

0
推荐指数
1
解决办法
64
查看次数