天道酬勤,学无止境

shell脚本中的“源”命令不起作用[重复]("source" command in shell script not working [duplicate])

问题

我有一个要在 Centos 7 中获取的文件。如果我这样做,它就可以正常工作:

$ source set_puregev_env

但是,如果我把它放在一个 shell 脚本中,它就不起作用了..

$ sh xRUN 
xRUN: line 3: source: set_puregev_env: file not found

这是我的 shell 脚本:xRUN

#!/bin/bash

source set_puregev_env

谁能告诉我我可能做错了什么或遗漏了什么?

回答1

source 是在 bash 中实现的命令,但不是在 sh 中。 有多种方法可以修复您的脚本。 选择其中之一。

使用 bash 解释器运行脚本

当您调用xRUN脚本时 - 您明确告诉它由sh解释

$ sh xRUN 

要使用 bash 更改和解释脚本,请执行以下操作

$ bash xRUN 

这将使 bash 解释源命令,并且您的脚本将起作用。

使用 dot 命令使 script bourne 兼容

您还可以使用 dot 命令更改源,该命令执行相同的操作,但在 bourne 和 bash 中均受支持。

更改行:

source set_puregev_env

和:

. set_puregev_env 

现在脚本可以使用 sh 或 bash。

使脚本可执行

您还应该直接运行脚本以避免混淆,方法是使其可执行chmod +x xRUN ,并像这样调用它:

$ ./xRUN

然后它将使用在shebang 中指定的命令并使用脚本的其余部分作为输入。 在您的情况下,它将使用 bash - 因为这是在 shebang 中指定的。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在sh shell中找不到源命令(source command not found in sh shell)
    问题 我有一个使用sh shell的脚本。 在使用source命令的行中出现错误。 似乎source未包含在我的sh shell中。 如果我明确尝试从shell运行source ,则会得到: sh: 1: source: not found 我应该以某种方式安装“源代码”吗? 我的sh版本是否错误? 回答1 /bin/sh通常是试图模仿Shell的其他一些Shell。 许多发行版都将/bin/bash用于sh ,它支持source 。 但是,在Ubuntu上,使用的/bin/dash不支持source 。 大多数壳使用. 代替source 。 如果您无法编辑该脚本,请尝试更改运行该脚本的外壳。 回答2 在Bourne shell(sh)中,使用。 源文件命令 . filename 回答3 $ls -l `which sh` /bin/sh -> dash $sudo dpkg-reconfigure dash #Select "no" when you're asked [...] $ls -l `which sh` /bin/sh -> bash 这样就可以了 回答4 内置的source是bashism。 将此简单地写为. 反而。 例如 . $FILE # OR you may need to use a relative path (such as in an `npm`
  • 如何让源命令在 shell 脚本之外生效?(How do I get a source command to take effect outside the shell script?)
    问题 我想编写一个小脚本来获取我的 virtualenv(用于 Python 项目)目录。 当我在我的项目目录中的某个地方时,我知道我的虚拟环境的“venv”目录位于我当前目录的祖先之一的目录中。 我想编写一个 shell 脚本来venv/bin/activate并且它的效果应该在这个 shell 脚本之外持续存在。 这不是现在发生的。 这是我的代码: #!/bin/bash #set -x while [ $PWD != "/" ]; do #echo $PWD if [ -d "venv" ]; then echo "venv found in $PWD. Sourcing." source venv/bin/activate break else cd .. fi done 为什么它现在不起作用,我该如何解决? 编辑: 如果有帮助,venv/bin/activate 的内容在这里:http://pastebin.com/TZ40brsq 由virtualenv 工具生成(一般用于Python 项目)。 回答1 您将不得不使用调用脚本 source path/to/script 或者 . path/to/script (同样的事情)而不是运行它。 这是一种安全措施,当您运行程序时,它不能更改其父进程的环境(即您的 shell 会话)。 但是,当您使用source ,您是在告诉
  • 源在 shell 脚本中不起作用(source not working from within shell script)
    问题 我在 shell 脚本中有以下行: source bash_profile 它没有错误,但它也没有做任何我能看到的事情(它没有像我期望的那样重新加载我的别名) 但是,从 shell 脚本所在的同一文件夹中,如果我只是从 shell 运行命令,它会像我期望的那样工作。 我也从不从脚本中更改目录。 事实上,这里是脚本: direction="to" destination="local" if [ -n $1 ] then direction=$1 fi if [ -n $2 ] then destination=$2 fi command=$direction$destination if [ $command = "fromlocal" -o $command = "togit" ] then cp /c/Program\ Files/Git/etc/bash_profile /d/automata/flgitscripts/bash_profile else cp /d/automata/flgitscripts/bash_profile /c/Program\ Files/Git/etc/bash_profile fi source /c/Program\ Files/Git/etc/bash_profile 我使用脚本来管理与 bash_profile
  • 如何在POSIX sh中获取脚本目录?(How to get script directory in POSIX sh?)
    问题 我的bash脚本中有以下代码。 现在我想在POSIX sh中使用它。 如何转换? DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" 回答1 $BASH_SOURCE的POSIX-shell( sh )对应$BASH_SOURCE是$0 。 请参阅底部的背景信息 注意:关键区别在于,如果源代码是脚本的源代码(使用.加载到当前shell中) ,则下面的代码片段将无法正常工作。 下面进一步解释 请注意,在以下代码段中,我已将DIR更改为dir ,因为最好不要使用全大写的变量名,以避免与环境变量和特殊的shell变量发生冲突。 在CDPATH=前缀需要的地方> /dev/null在原来的命令: $CDPATH设置为空字符串,以保证cd从来没有任何回音。 在最简单的情况下,可以这样做(相当于OP的command ): dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) 如果在目录和/或其组件为符号链接的情况下,如果还要将最终目录路径解析为其最终目标,请在pwd命令中添加-P : dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) 警告:这是不一样的发现脚本自身起源的真正目录: 假设您的脚本foo在
  • rvm安装不起作用:“ RVM不是功能”(rvm installation not working: “RVM is not a function”)
    问题 我刚刚安装了RVM,但无法使其正常运行。 我的.profile文件末尾有这样一行: [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" 我试图运行source .profile并重新启动终端,但是仍然,当我运行rvm use 1.9.2我得到了: RVM is not a function, selecting rubies with 'rvm use ...' will not work. 我的系统是Ubuntu 11.10。 回答1 您没有使用登录外壳。 此处描述了启用登录标志的过程,还可以在此处找到有关登录shell的一些详细信息。 因此,您需要在Gnome终端的设置中选中“以登录身份运行”选项。 设置该标志后,需要打开新的终端。 有时需要将命令设置为/bin/bash --login 。 对于远程连接,了解运行交互式ssh会话与执行单个命令之间的区别非常重要。 在运行ssh server并与之交互地使用服务器时,默认情况下您使用的是登录shell,但一切都很好,但是对于ssh server "command"您没有使用登录shell,并且需要使用ssh server 'bash -lc "command"'来运行它ssh server 'bash -lc "command"' 。
  • .bashrc 中的 shopt -s extdebug 在脚本文件中不起作用(shopt -s extdebug in .bashrc not working in script files)
    问题 我正在编写一个 bash 脚本 (echoo.sh),目的是在命令执行之前对其进行回显。 我在 .bashrc 中获取此脚本 (echoo.sh)。 但是它不会对在脚本文件(tmp.sh)中使用 bash shebang 运行的命令执行。 下面是我到目前为止的代码 回声文件 #!/usr/bin/env bash shopt -s extdebug; get_hacked () { [ -n "$COMP_LINE" ] && return # not needed for completion [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # not needed for prompt local this_command=$BASH_COMMAND; echo $this_command; }; trap 'get_hacked' DEBUG 当我打开一个 shell 并运行任何命令时 - 它有效。 但是对于脚本文件中的内容,它不起作用。 一些进一步的尝试: 我尝试在脚本文件 (tmp.sh) 中获取 .bashrc 文件 - 没有用。 我在 tmp.sh 中获取了 echoo.sh 并且它起作用了。 所以,我试图理解 如果我只是在 .bashrc 中为脚本中运行的内容提供脚本,为什么它不起作用? 为什么不进一步尝试
  • linux 源命令在构建 Dockerfile 时不起作用(linux source command not working when building Dockerfile)
    问题 我有一个定义 Ruby on Rails 堆栈的 Dockerfile。 这是 Dockerfile: FROM ubuntu:14.04 MAINTAINER example <examplen@example.com> # Update RUN apt-get update # Install Ruby and Rails dependencies RUN apt-get install -y \ ruby \ ruby-dev \ build-essential \ libxml2-dev \ libxslt1-dev \ zlib1g-dev \ libsqlite3-dev \ nodejs \ curl RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 RUN curl -sSL https://get.rvm.io | bash -s stable --rails RUN /bin/bash -c "source /usr/local/rvm/scripts/rvm" # Install Rails RUN gem install rails # Create a new Rails app under /src/my-app
  • 如何检测脚本是否源(How to detect if a script is being sourced)
    问题 我有一个脚本,如果它是源代码,我不希望它调用exit 。 我考虑过检查$0 == bash但是如果脚本是从另一个脚本中获取的,或者用户是从另一个类似ksh外壳中获取的,这就会出现问题。 有没有可靠的方法来检测脚本是否源? 回答1 这似乎可以在Bash和Korn之间移植: [[ $_ != $0 ]] && echo "Script is being sourced" || echo "Script is a subshell" 与此类似的行或类似pathname="$_"的赋值(带有稍后的测试和操作)必须位于脚本的第一行或shebang之后的行中(如果使用的话,应用于ksh in)以便在大多数情况下都可以正常工作)。 回答2 如果您的Bash版本知道BASH_SOURCE数组变量,请尝试以下操作: # man bash | less -p BASH_SOURCE #[[ ${BASH_VERSINFO[0]} -le 2 ]] && echo 'No BASH_SOURCE array variable' && exit 1 [[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..." 回答3 针对bash , ksh , zsh可靠解决方案
  • 使用 JSch setCommand 执行时,带有源选项的 Shell ping 命令失败(Shell ping command with source option is failing when executed using JSch setCommand)
    问题 我正在测试短 ping 测试程序。 如果我将简单的 ping 命令"ping yyyy -c 5 -s 500 "为setCommand()函数,它会按设计工作。 但是如果我添加额外的 ping 选项, "ping source xxxx host yyyy -c 5 -s 500" ,我得到 ping: 未知主机来源 回消息。 如果我从 x 终端手动执行这两个命令,这两个命令都可以正常工作。 我需要让程序从不同的源接口 IP 进行 ping。 使用 JSch setCommand两个命令有什么区别? ping yyyy -c 5 -s 500 (工作) ping source xxxx host yyyy -c 5 -s 500 (不工作) 代码: public static void main(String[] arg){ try{ JSch jsch=new JSch(); String host=null; if(arg.length>0){ host=arg[0]; } else{ host=JOptionPane.showInputDialog("Enter username@hostname", System.getProperty("user.name")+ "@localhost"); } String user=host.substring(0, host
  • 在shell脚本中使用别名? [复制](using alias in shell script? [duplicate])
    问题 这个问题已经在这里有了答案: 如何在其他脚本中使用.bashrc中定义的别名? (6个答案) 8个月前关闭。 我在示例shell脚本中定义的别名不起作用。 而且我是Linux Shell脚本的新手。 以下是示例外壳文件 #!/bin/sh echo "Setting Sample aliases ..." alias xyz="cd /home/usr/src/xyz" echo "Setting done ..." 执行此脚本后,我可以看到回显消息。 但是,如果我执行alias命令,则会看到以下错误 xyz: command not found 我错过了什么吗? 回答1 源您的脚本,不要像./foo.sh或sh foo.sh那样执行它 如果您以这种方式执行脚本,则该脚本将在子Shell中运行,而不是当前运行。 source foo.sh 会为你工作。 回答2 您需要设置一个特定的选项expand_aliases : shopt -s expand_aliases 例子: # With option $ cat a #!/bin/bash shopt -s expand_aliases alias a="echo b" type a a $ ./a a is aliased to 'echo b' b # Without option $ cat a #!/bin/bash
  • 从Shell脚本导入函数(Importing functions from a shell script)
    问题 我有一个要使用shUnit测试的shell脚本。 该脚本(以及所有功能)都在一个文件中,因为它使安装更加容易。 script.sh示例 #!/bin/sh foo () { ... } bar () { ... } code 我想写第二个文件(不需要分发和安装)来测试script.sh定义的功能。 类似于run_tests.sh #!/bin/sh . script.sh # Unit tests 现在的问题出在. (或Bash中的source )。 它不仅解析函数定义,而且执行脚本中的代码。 由于没有参数的脚本没有任何坏处,我可以 . script.sh > /dev/null 2>&1 但是我在徘徊,是否有更好的方法可以实现自己的目标。 编辑 在源脚本调用exit的情况下,我建议的解决方法不起作用,因此我必须捕获退出 #!/bin/sh trap run_tests ERR EXIT run_tests() { ... } . script.sh 调用了run_tests函数,但是一旦我重定向了source命令的输出,脚本中的函数就不会被解析,并且在陷阱处理程序中不可用 这有效,但我得到script.sh的输出: #!/bin/sh trap run_tests ERR EXIT run_tests() { function_defined_in_script_sh }
  • Conda激活不起作用?(Conda activate not working?)
    问题 gonzo  ~/a/packages  conda env list # conda environments: # ppo_latest /nohome/jaan/abhishek/anaconda3/envs/ppo_latest root * /nohome/jaan/abhishek/anaconda3 gonzo  ~/a/packages  conda activate ppo_latest gonzo  ~/a/packages  which python (ppo_latest) /nohome/jaan/abhishek/anaconda3/bin/python gonzo  ~/a/packages  conda deactivate (ppo_latest) gonzo  ~/a/packages  which python /nohome/jaan/abhishek/anaconda3/bin/python 环境被激活而没有错误。 然后,我们检查它引用的是哪个python。 它没有改变,为什么? 回答1 从conda 4.4开始,命令 conda activate <envname> 在所有平台上都是相同的。 对于非Windows平台,在conda 4.4
  • 在带有'source'的Dockerfile中使用RUN指令不起作用(Using the RUN instruction in a Dockerfile with 'source' does not work)
    问题 我有一个Dockerfile,我正在将其安装在一起以安装香草python环境(我将在其中安装应用程序,但稍后再安装)。 FROM ubuntu:12.04 # required to build certain python libraries RUN apt-get install python-dev -y # install pip - canonical installation instructions from pip-installer.org # http://www.pip-installer.org/en/latest/installing.html ADD https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py /tmp/ez_setup.py ADD https://raw.github.com/pypa/pip/master/contrib/get-pip.py /tmp/get-pip.py RUN python /tmp/ez_setup.py RUN python /tmp/get-pip.py RUN pip install --upgrade pip # install and configure virtualenv RUN pip install
  • 如何在python解释器shell中重复最后一个命令?(How to repeat last command in python interpreter shell?)
    问题 我如何重复最后一个命令? 常用键:向上、Ctrl+向上、Alt-p 不起作用。 他们产生无意义的字符。 (ve)[kakarukeys@localhost ve]$ python Python 2.6.6 (r266:84292, Nov 15 2010, 21:48:32) [GCC 4.4.4 20100630 (Red Hat 4.4.4-10)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print "hello world" hello world >>> ^[[A File "<stdin>", line 1 ^ SyntaxError: invalid syntax >>> ^[[1;5A File "<stdin>", line 1 [1;5A ^ SyntaxError: invalid syntax >>> ^[p File "<stdin>", line 1 p ^ SyntaxError: invalid syntax >>> 回答1 我使用以下内容在 python shell 上启用历史记录。 这是我的.pythonstartup文件。 PYTHONSTARTUP 环境变量设置为此文件路径。 # python startup
  • 在 bash shell 脚本中重新加载 .profile(在 unix 中)?(Reload .profile in bash shell script (in unix)?)
    问题 我是 bash shell 脚本的新手,遇到了一个挑战。 我知道我可以通过执行以下操作来重新加载我的“.profile”文件: . .profile 但我试图在我正在编写的 bash 脚本中执行相同的操作,但它不起作用。 有任何想法吗? 我还能提供什么来澄清? 谢谢 回答1 试试这个来重新加载你当前的 shell: source ~/.profile 回答2 试试这个: cd source .bash_profile 回答3 尝试重新加载/源 ~/.profile 文件时会出现一些问题。 [这里指的是 Ubuntu linux - 在某些情况下,命令的细节会有所不同] 你是直接在终端还是在脚本中运行它? 你如何在脚本中运行它? 广告。 1) 直接在终端中运行它意味着不会创建子shell。 所以你可以使用两个命令: source ~/.bash_profile 或者 . ~/.bash_profile 在这两种情况下,这都将使用 .profile 文件的内容更新环境。 广告 2) 您可以通过调用来启动任何 bash 脚本 sh myscript.sh 或者 . myscript.sh 在第一种情况下,这将创建一个不会影响系统环境变量的子外壳,并且它们仅对子外壳进程可见。 完成 subshel​​l 命令后,将不会应用任何导出等。 这是一个常见的错误
  • 采购一个python脚本(sourcing a python script)
    问题 最近,我遇到了 Linux 命令source ,然后在它的作用上找到了这个答案。 我的理解是source执行传递给它的文件,它确实适用于一个简单的 shell 脚本。 然后我尝试在 Python 脚本上使用source - 但它不起作用。 Python 脚本有一个shebang(例如#!/usr/bin/python ),我可以执行./python.py ,因为该脚本具有可执行权限。 如果可能, source python.py也应该是可能的,对吧? 唯一的区别是./在新 shell 中执行,而source在当前 shell 中执行。 为什么它不适用于.py脚本? 我在这里错过了什么吗? 回答1 您仍然没有完全了解source作用。 source确实从当前 shell 进程中的文件中执行命令。 它可以有效地执行此操作,就好像您已将它们直接输入到当前的 shell 中一样。 这样做是必要的,因为当你运行一个 shell 脚本而不使用它时,它会产生一个子 shell——一个新进程。 当这个进程退出时,当你返回到它产生的 shell 时,在该脚本中所做的任何更改都会丢失。 因此,您不能将 Python 输入到 shell 中,因为 Python 解释器始终是与您的 shell 不同的进程。 运行 Python 脚本会产生一个全新的进程,当该进程退出时,其状态将丢失。 当然
  • 在 Vagrant 配置期间更新 .bashrc 和环境变量(Updating .bashrc and environment variables during Vagrant provisioning)
    问题 我正在使用 Vagrant 设置一个包含 python、pip、virtualenv、virtualenvwrapper 和一些要求的盒子。 供应 shell 脚本将 virtualenvwrapper 所需的行添加到.bashrc 。 它做了一个非常基本的检查,它们是否已经存在,因此它不会在每个条款中复制它们: if ! grep -Fq "WORKON_HOME" /home/vagrant/.bashrc; then echo 'export WORKON_HOME=/home/vagrant/.virtualenvs' >> /home/vagrant/.bashrc echo 'export PROJECT_HOME=/home/vagrant/Devel' >> /home/vagrant/.bashrc echo 'source /usr/local/bin/virtualenvwrapper.sh' >> /home/vagrant/.bashrc source /home/vagrant/.bashrc fi 这似乎工作正常; 配置完成后,这些行在.bashrc ,我可以通过 ssh 连接到该框并使用 virtualenvwrapper。 但是,virtualenvwrapper 在配置期间不起作用。 在上述部分之后,接下来检查 pip 要求文件并尝试使用
  • 如何从 perl 脚本运行“源”命令(Linux)?(How to run "source" command (Linux) from a perl script?)
    问题 我想source Perl脚本(script.pl)的脚本。 system ("source /some/generic/script"); 请注意,此通用脚本可以是 shell、python 或任何其他脚本。 此外,我无法将这个通用脚本中存在的逻辑复制到我的 Perl 脚本中。 我尝试用 ``, exec和qx//替换system 。 每次我收到以下错误: 无法执行“源”:在 script.pl 第 18 行没有这样的文件或目录。 我在互联网上遇到了许多论坛,讨论了这个问题的各种原因。 但他们都没有提供解决方案。 有没有办法从 Perl 脚本运行/执行source命令? 回答1 在 bash 等中, source是一个内置的,这意味着读取这个文件,并在本地解释它(有点像#include )。 在这种情况下,这是没有意义的 - 您要么需要从命令中删除source ,并在 shell 脚本的开头有一个 shebang ( #! ) 行,告诉系统使用哪个 shell 来执行该脚本,或者您需要明确告诉system使用哪个 shell,例如 system "/bin/sh", "/some/generic/script"; [没有评论在这种情况下是否真的适合使用system ]。 回答2 这里发生了一些事情。 首先,子进程不能改变其父进程的环境。 只要它的过程存在
  • 如何在bash中获取csh脚本以设置环境(how to source a csh script in bash to set the environment [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我们在Solaris上运行Oracle,默认情况下外壳为csh。 因此,登录脚本还在csh中设置了oracle_home和oracle_sid。 但是我不喜欢csh,并且想要使用bash来完成我的工作。 那么如何在bash中获取csh登录脚本的源代码呢? 例如,以下是.cshrc文件中的内容。 当使用bash时,我想使用这些变量。 一种方法是再次复制变量并使用bash命令,例如export ORACLE_SID = TEST。 但是,这样做将需要我们维护文件的两个副本。 当我们更改数据库名称或升级数据库时,我需要单独维护bash登录文件。 只是使用类似的东西真是太好了 bash中的源.cshr,但是它不起作用。 setenv ORACLE_SID TEST setenv ORACLE_HOME /oracle/TEST/home/products/10204 setenv EPC_DISABLED TRUE setenv MANPATH /usr/local/man:/usr/share/man setenv EDITOR vi setenv LD_LIBRARY_PATH $ORACLE_HOME/lib:/usr
  • bash脚本中的`exec`之后不会运行任何代码[重复](No code will run after `exec` in bash script [duplicate])
    问题 这个问题在这里已经有了答案: 我的 shell 脚本在 exec 后停止(3 个回答) 去年关闭。 我在命令名称中使用变量扩展进行测试的示例 bash 脚本: test_command_w_variable_expansion_in_name.sh : #!/bin/bash # Gabriel Staples # 21 Mar. 2020 echo "PATH = \"$PATH\"" # PATH="$HOME/bin:$PATH" # echo "PATH = \"$PATH\"" # 1st, create a command in ~/bin to test here mkdir -p ~/bin echo -e "#!/bin/bash\necho \"This is a test script found in ~/bin.\"" > ~/bin/gs_test_script chmod +x ~/bin/gs_test_script # 1) # command: `echo` CMD_PREFIX="ec" ${CMD_PREFIX}ho "hey" # works # exec "${CMD_PREFIX}ho" "hey" # works, but then prevents the code below from running! # eval "$