天道酬勤,学无止境

在没有源命令的情况下将 bash 脚本作为源运行(Run bash script as source without source command)

问题
sup Argument source sup Argument . sup Argument
回答1
sup() { ... }
回答2
回答3
alias sup=". ~/bin/sup" $ pwd /work1/jleffler $ echo "cd /work5/atria" > $HOME/bin/yyy $ alias yyy=". ~/bin/yyy" $ yyy $ pwd /work5/atria $
回答4
if [ -z "$PS1" ] ; then echo "This script must be sourced. Use \"source <script>\" instead." exit fi if [ "$PS1" ] ; then echo "This script cannot be sourced. Use \"./<script>\" instead." return fi
标签

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在Bash脚本中激活virtualenv源(How to source virtualenv activate in a Bash script)
    问题 如何创建Bash脚本来激活Python virtualenv? 我有一个类似的目录结构: .env bin activate ...other virtualenv files... src shell.sh ...my code... 我可以通过以下方式激活我的virtualenv: user@localhost:src$ . ../.env/bin/activate (.env)user@localhost:src$ 但是,从Bash脚本执行相同操作将不会执行以下操作: user@localhost:src$ cat shell.sh #!/bin/bash . ../.env/bin/activate user@localhost:src$ ./shell.sh user@localhost:src$ 我究竟做错了什么? 回答1 当您获取源代码时,就是将激活脚本加载到活动的shell中。 当您在脚本中执行此操作时,会将其加载到该外壳中,该外壳将在脚本完成后退出,并且您将返回到原始的未激活外壳。 最好的选择是在函数中执行此操作 activate () { . ../.env/bin/activate } 或别名 alias activate=". ../.env/bin/activate" 希望这可以帮助。 回答2 您应该使用source调用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 }
  • 如何检测脚本是否源(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可靠解决方案
  • 如何在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在
  • shell脚本中的“源”命令不起作用[重复]("source" command in shell script not working [duplicate])
    问题 这个问题在这里已经有了答案: sh 和 Bash 之间的区别(12 个回答) 3年前关闭。 我有一个要在 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 现在脚本可以使用
  • 如何使用内置的纯未设置 shell? 你能写出不受篡改的 shell 脚本吗?(How can you use pure unset shell builtin? Can you write shell scripts that are immune to tampering?)
    问题 我的意思是我想使用不是 shell 函数本身的unset 。 如果我能做到这一点,我可以通过运行来确保该command是纯的 #!/bin/sh { \unset -f unalias command [; \unalias unset command [ } 2>/dev/null; # make zsh find *builtins* with `command` too: [ -n "$ZSH_VERSION" ] && options[POSIX_BUILTINS]=on 如果我使用的是 Debian Almquist shell(破折号),我想我可以相信\unset是纯粹的。 至少我无法在dash定义一个名为unset的 shell 函数。 而在bash或zsh我可以定义unset() { echo fake unset; } unset() { echo fake unset; } ,然后我无法取消设置功能: \unset -f unset输出“假未设置”。 与此相关,在bash脚本中,可以通过export -f <function name>导出一个函数,以便在脚本调用的bash脚本中使用。 但是,这在dash脚本中不起作用。 我想知道,如果我使用dash ,我是否必须担心在我正在编写的脚本文件之外将命令定义为 shell 函数? 其他 POSIX 兼容的
  • 从 subprocess.Popen 调用“源”命令(Calling the "source" command from subprocess.Popen)
    问题 我有一个 .sh 脚本,我用source the_script.sh调用source the_script.sh 。 定期调用这个很好。 但是,我试图通过subprocess.Popen从我的 python 脚本调用它。 从 Popen 调用它,我在以下两个场景调用中收到以下错误: foo = subprocess.Popen("source the_script.sh") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 672, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory >>> foo = subprocess.Popen("source the_script.sh", shell = True) >>> /bin/sh: source: not found 是什么赋予了? 当我可以在 python
  • 如何从 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 这里发生了一些事情。 首先,子进程不能改变其父进程的环境。 只要它的过程存在
  • Unix:源和导出有什么区别?(Unix: What is the difference between source and export?)
    问题 我正在编写一个 shell 脚本,以读取一个具有 key=value 对的文件并将这些变量设置为环境变量。 但我有一个疑问,如果我执行source file.txt是否会将在该文件中定义的变量设置为环境变量,或者我应该逐行读取文件并使用 export 命令进行设置? 在这种情况下,源命令与导出不同吗? 回答1 当source文件时,作业将被设置但不输出变量,除非allexport选项设置。 如果您希望导出所有变量,使用allexport和source文件比读取文件并显式使用export要简单得多。 换句话说,你应该这样做: set -a . file.txt (我更喜欢.因为它比source更便携,但source在bash工作得很好。) 请注意,导出变量不会使其成为环境变量。 它只是使它成为任何子shell中的环境变量。 回答2 source ( . )与export (以及最后的一些文件锁定 [ flock ] 东西): 简而言之: source some_script.sh ,或符合 POSIX 标准的等效文件. some_script.sh . some_script.sh ,从其他脚本中. some_script.sh变量,而 export my_var="something"将变量推送到从当前脚本/进程调用/启动的其他脚本/进程。 使用source some
  • 在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`
  • 从bash脚本调用conda源激活(calling conda source activate from bash script)
    问题 我正在尝试通过bash脚本激活我的conda env。 即使脚本运行正常,并且我的PATH在脚本中似乎已更改,但在脚本终止后仍会以某种方式重置。 我可以从cmd行调用source activate test ,它可以正常工作。 下面是一个示例以及输出。 脚本: PycharmProjects/test » cat ./example.sh echo "before calling source: $PATH" source activate test echo "after calling source: $PATH" 输出: ./example.sh before calling source: /Use rs/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin discarding /Users/me/miniconda3/bin from PATH prepending /Users/me/miniconda3/envs/test/bin to PATH after calling source: /Users/me/miniconda3/envs/test/bin:/usr/local/bin:/usr/local/sbin
  • 当我运行 ssh 进入远程服务器的 bash 脚本并运行 wget 之类的命令时,它会保存在源服务器上而不是目标服务器上?(When I run a bash script that ssh's into a remote server and run a command like wget it saves on the source not the destination server?)
    问题
  • 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"' 。
  • 是否可以在Windows批处理和Linux Bash中运行单个脚本?(Single script to run in both Windows batch and Linux Bash?)
    问题 是否可以编写一个可以在Windows(视为.bat)和Linux(通过Bash)中执行的脚本文件? 我知道两者的基本语法,但没有弄清楚。 它可能利用了一些Bash晦涩的语法或Windows批处理处理器的故障。 要执行的命令可能只是执行其他脚本的一行。 这样做的动机是针对Windows和Linux仅具有一个应用程序启动命令。 更新:系统“本机” shell脚本的需要是它需要选择正确的解释器版本,符合某些知名的环境变量等。不建议安装其他环境,例如CygWin-我想保留“下载并运行”。 Windows唯一需要考虑的其他语言是Windows脚本宿主-WSH,自98起默认预设。 回答1 我所做的是使用cmd的标签语法作为注释标记。 标签字符,一个冒号( : ),相当于true在大多数POSIXish炮弹。 如果您立即在标签字符后接另一个不能在GOTO使用的字符,那么注释您的cmd脚本不应影响您的cmd代码。 技巧是将代码行放在字符序列“ :; ”之后:; ”。 如果您主要编写单行脚本,或者可以(对于许多情况)可以为多行cmd编写一行sh ,则可能会很好。 不要忘记使用$? 必须在下一个冒号之前:因为:重置$? 到0。 :; echo "Hi, I’m ${SHELL}."; exit $? @ECHO OFF ECHO I'm %COMSPEC% 一个保护$?非常人为的例子$? :
  • Windows Bash和Visual Studio代码:如何将bash作为运行任务启动?(Windows Bash and Visual Studio Code: How can I launch bash as a run task?)
    问题 如何从Visual Studio代码运行Windows Bash作为运行任务? 这是我对tasks.json进行的许多尝试中的一些尝试。 { "version": "0.1.0", "command": "cmd", "isShellCommand": true, "args": [ "RunShellScript.bat" ], "showOutput": "always" } RunShellScript.bat只有这一行: bash myShellScript.sh 。 如果您只是从头开始打开cmd,然后键入该行,它将执行。 如果您只需双击该文件,它也可以完美运行。 但是,从VSCode启动时,此输出将一直挂起,直到我终止它为止。 尝试次数2: { "version": "0.1.0", "command": "cmd", "isShellCommand": true, "args": [ "bash myShellScript.sh" ], "showOutput": "always" } 就像上面一样,它也挂起了。 尝试次数3: { "version": "0.1.0", "command": "C:/Windows/System32/bash", "isShellCommand": false, "args": [ "myShellScript.sh" ],
  • 如何从脚本本身中获取Bash脚本的源目录?(How can I get the source directory of a Bash script from within the script itself?)
    问题 我如何获取该脚本内Bash脚本所在目录的路径? 我想将Bash脚本用作另一个应用程序的启动器。 我想将工作目录更改为Bash脚本所在的目录,以便可以对该目录中的文件进行操作,如下所示: $ ./application 回答1 #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" 是有用的单行代码,无论从何处调用脚本,它都将为您提供脚本的完整目录名称。 只要用于查找脚本的路径的最后一个组成部分不是符号链接(目录链接都可以),它将起作用。 如果您还想解析到脚本本身的任何链接,则需要一个多行解决方案: #!/bin/bash SOURCE="${BASH_SOURCE[0]}" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative
  • 如何使用SSH在远程计算机上运行本地Shell脚本?(How to use SSH to run a local shell script on a remote machine?)
    问题 我必须在远程计算机上运行本地外壳程序脚本(windows / Linux)。 我在机器A和B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。 本地和远程计算机可以是基于Windows或Unix的系统。 有没有一种方法可以使用plink / ssh来执行此操作? 回答1 如果计算机A是Windows机器,则可以将Plink(PuTTY的一部分)与-m参数一起使用,它将在远程服务器上执行本地脚本。 plink root@MachineB -m local_script.sh 如果计算机A是基于Unix的系统,则可以使用: ssh root@MachineB 'bash -s' < local_script.sh 您不必将脚本复制到远程服务器即可运行它。 回答2 这是一个古老的问题,Jason的答案很好用,但我想补充一下: ssh user@host <<'ENDSSH' #commands to run on remote host ENDSSH 这也可以与需要用户输入的su和命令一起使用。 (请注意'逃脱的heredoc”) 编辑:由于此答案不断获得一些流量,我将添加更多信息到heredoc的这种奇妙用法: 您可以使用此语法嵌套命令,这就是嵌套似乎起作用的唯一方式(以合理的方式) ssh user@host <<'ENDSSH' #commands
  • Shell脚本可以设置调用Shell的环境变量吗? [复制](Can a shell script set environment variables of the calling shell? [duplicate])
    问题 这个问题已经在这里有了答案: 是否可以在不采购bash脚本的情况下将变量从环境导出到环境? (8个答案) 1年前关闭。 我正在尝试编写一个shell脚本,该脚本在运行时将设置一些环境变量,这些变量将保持在调用者的shell中。 setenv FOO foo 在csh / tcsh中,或 export FOO=foo 在sh / bash中,仅在脚本执行期间进行设置。 我已经知道了 source myscript 将运行脚本的命令而不是启动新的shell,这可能会导致设置“调用者”的环境。 但是这里有问题: 我希望可以从bash或csh调用此脚本。 换句话说,我希望任一外壳程序的用户都能够运行我的脚本并更改其外壳程序的环境。 所以'source'对我不起作用,因为运行csh的用户无法获取bash脚本,而运行bash的用户无法获取csh脚本。 是否有任何合理的解决方案,而不必在脚本上编写和维护两个版本? 回答1 您的Shell进程具有父级环境的副本,并且无法访问父级环境。 当Shell进程终止时,您对其环境所做的任何更改都将丢失。 采购脚本文件是配置Shell环境的最常用方法,您可能只想硬着头皮,为两种口味的Shell维护一种。 回答2 使用“点空间脚本”调用语法。 例如,以下是使用脚本的完整路径来执行此操作的方法: . /path/to/set_env_vars.sh
  • 使用嵌入式引号(源参数)运行命令时,Bash 脚本失败(Bash script fails when running command with embedded quotes (source parameters))
    问题 我正在使用source将生成的变量插入到文件中的字符串中,以便从 bash 脚本中执行该字符串。 我已经回显了生成的字符串以与从命令行工作的字符串进行比较,我似乎看不出任何区别,但是 bash 命令失败了,因为提供的参数似乎在中间的某个地方混淆了。 我在 ice_name 字符串周围转了双引号,所以它看起来与我回显时起作用的相同 我需要转义其他字符吗? 它似乎在-ice_name参数之前-ice_name 这是命令 avconv -re -i test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a 128k -legacy_icecast 1 -ice_name "Raspi Test Stream of MP3" -f mp3 icecast://:mypwd@icecast.servername.com/my/mount/point/url 不确定你是否需要文件 beng 来源,但以防万一它是 #!/bin/bash # # stream.cfg # # WiFi Settings # wifi_name=mywifi wifi_password=mywifipwd # # Icecast Server Settings # icecast_server=icecast.server.com icecast_port
  • “源”命令有什么作用?(What does the command 'source' do?)
    问题 我想知道命令source做什么的。 我试过了: 什么是 $ whatis source source: nothing appropriate. 男人 $ man source No manual entry for source 来源(-h、--help 等...) $ source source: not enough arguments 但似乎没有关于它的文档。 我通常使用它来保存我的 dotfiles 上的任何更改,但它到底是做什么的? 为什么没有关于它的文档? 回答1 source 是一个 bash shell 内置命令,它在当前 shell中执行作为参数传递的文件的内容。 它在 中有一个同义词. (时期)。 句法. filename [arguments] source filename [arguments] 从源手册 source filename [arguments] Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename. If filename does not contain a slash, file names in