假设我有这个脚本
export.bash:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
Run Code Online (Sandbox Code Playgroud)
当我执行脚本,并尝试访问$VAR
我没有价值!
echo $VAR
Run Code Online (Sandbox Code Playgroud)
有没有办法$VAR
只通过执行export.bash来访问它而不需要采购它?
使用find . -print0
似乎是获取bash中文件列表的唯一安全方法,因为文件名可能包含空格,换行符,引号等.
但是,我很难让find的输出在bash或其他命令行实用程序中有用.我设法使用输出的唯一方法是将它传递给perl,并将perl的IFS更改为null:
find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'
Run Code Online (Sandbox Code Playgroud)
此示例打印找到的文件数,避免文件名中的换行符损坏计数的危险,如下所示:
find . | wc -l
Run Code Online (Sandbox Code Playgroud)
由于大多数命令行程序不支持空分隔输入,我认为最好的方法是捕获find . -print0
bash数组中的输出,就像我在上面的perl片段中所做的那样,然后继续执行任务,无论它是什么是.
我怎样才能做到这一点?
这不起作用:
find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )
Run Code Online (Sandbox Code Playgroud)
一个更普遍的问题可能是:如何用bash中的文件列表做有用的事情?
说明:
我有一个小的bash脚本,它只运行任何 Linux命令(例如说ifconfig
)
ifconfig的典型输出是这样的:
eth0 Link encap:Ethernet HWaddr 30:F7:0D:6D:34:CA
inet addr:10.106.145.12 Bcast:10.106.145.255 Mask:255.255.255.0
inet6 addr: fe80::32f7:dff:fe6d:34ca/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1104666 errors:0 dropped:0 overruns:0 frame:0
TX packets:2171 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:444437904 (423.8 MiB) TX bytes:238380 (232.7 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.255.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:15900 errors:0 dropped:0 overruns:0 frame:0
TX packets:15900 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 …
Run Code Online (Sandbox Code Playgroud) (见底部更新)
我觉得我在这里遗漏了一些非常明显的东西,但是我无法在shell脚本中更改gemsets.这个最小的脚本演示:
#!/usr/bin/env bash
rvm gemset use "testing"
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过Scripting RVM页面中的指令(尽管似乎没有必要):
#!/usr/bin/env bash
# Load RVM into a shell session *as a function*
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
# First try to load from a user install
source "$HOME/.rvm/scripts/rvm"
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
# Then try to load from a root install
source "/usr/local/rvm/scripts/rvm"
else
printf "ERROR: An RVM installation was not found.\n"
fi
rvm gemset use "testing"
Run Code Online (Sandbox Code Playgroud)
仍然没有去.
有趣的是,如果我尝试在没有首先创建"测试"gemset的情况下运行脚本,我会得到ERROR: Gemset 'testing' does …
我非常喜欢我node.js
的,我想用它作为我的bash
启动脚本~/.bashrc
,但我不知道如何导出变量。
目前我必须使用这种方法:
export PS1=`node ~/PS1.js`
export PS2=`node ~/PS2.js`
export PATH=`node ~/PATH.js`
Run Code Online (Sandbox Code Playgroud)
相反,我想.bashrc
看看
#!/usr/local/bin/node
//do something, define functions
export_var('PS1', PS1())
export_var('PS2', PS2())
export_var('PATH', generatePATH())
Run Code Online (Sandbox Code Playgroud)
process.env.PATH = something
不导出,只为当前正在执行的进程设置,也就是节点本身。
我有一个类似于以下的bash脚本:
function test
{
running=$(( $running - 1 ))
}
running=0
test &
echo $running
因为测试功能在子shell中运行,所以它不会影响运行变量,并且我得到0回显到屏幕.我需要子shell才能更改父shell变量,如何做到这一点?我试过出口但无济于事.
编辑感谢所有有用的答案,我想在后台运行此功能的原因是允许同时运行多个功能.我需要能够回调父脚本,告诉它何时完成所有功能.我一直在使用pid来做这个,但我不想检查循环中是否有多个进程不断存在.
我有一个项目涉及子目录与子makefile.我知道我可以使用export命令通过环境将变量从父makefile传递到子makefile.有没有办法将变量从子makefile传递给它的调用makefile?即可以反过来出口工作?我试过这个没有成功.我猜测一旦子make完成它的shell就会被破坏,同时它的环境变量也会被破坏.还有另一种向上传递变量的标准方法吗?
我需要将整个文本文件读入一个 shell 变量。已经有关于此的另一个线程,但它只给出了 sh 和 bash 的示例:
我如何在 csh 中做到这一点?
很抱歉开始一个新线程,但我是这个网站的新手,无法发表评论。如果你不能一开始就发表评论,你应该如何建立自己的声誉?