为了保持概览,我喜欢将多个命令始终以相同的顺序放置并一起自动启动(gradle、git、数据库、scala-REPL、jboss...)
-H (hold) 好像是终端终止后没有关闭的意思,但是我该如何随意终止这样的进程呢?一点也不?这样我就可以继续使用终端了。
我正在将 xubuntu 与 xfce4-terminal 和 bash 一起使用。是否有更好的 GUI 解决方案来启动多个命令,并能够在该窗口/选项卡中继续工作?
更新:如果您不知道这些命令:Jboss 和 gradle 不断产生输出,您不希望在同一个终端中混合使用。有时它们需要用 ^C 中断,然后重新启动。我不喜欢重新打开 xfce4-term 并导航到我需要操作的目录。
数据库和 scala-REPL 是交互式的,因此在后台启动它们是没有意义的。
我当前的启动脚本只是导航到所需的目录,并以正确的顺序打开所有选项卡以找到它们始终位于同一位置,并为其命名每个选项卡:
xfce4-terminal -T eclipse --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
--tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
--tab -T bash --working-directory=/home/stefan/oximity \
--tab -T gradle --working-directory=/home/stefan/oximity/med \
--tab -T git --working-directory=/home/stefan/oximity/med \
--tab -T mysql --working-directory=/opt/mini/mysql \
--tab -T jboss --working-directory=/opt/mini/jboss \
--tab -T jboss-log --working-directory=/opt/mini/jboss/standalone/log \
--tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala
Run Code Online (Sandbox Code Playgroud)
Eclipse 和 arandr …
谁能解释为什么分号是必要的,以便LANGbash 将其视为更新?
不起作用:
> LANG=Ja_JP bash -c "echo $LANG"
en_US
Run Code Online (Sandbox Code Playgroud)
作品:
> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP
Run Code Online (Sandbox Code Playgroud)
我正在 linux 上使用 bash 4.1.10 和在 cygwin 下使用相同版本
我知道 Bash 和 Zsh 支持local变量,但有些系统只有 POSIX 兼容的 shell。并且local在 POSIX shell 中未定义。
所以我想问一下哪些shell支持local关键字定义局部变量?
编辑:关于外壳我的意思是默认/bin/sh外壳。
如果我这样做:
SUMAN_DEBUG=foo echo $SUMAN_DEBUG
Run Code Online (Sandbox Code Playgroud)
我没有输出
但如果我这样做:
SUMAN_DEBUG=foo && echo $SUMAN_DEBUG
Run Code Online (Sandbox Code Playgroud)
然后我得到
“富”
这是为什么?
我曾经能够做这样的事情:
X=123 cat <<EOF
X is $X
EOF
Run Code Online (Sandbox Code Playgroud)
甚至更简单:
X=123 echo $X
Run Code Online (Sandbox Code Playgroud)
安装 bash 修复程序后,第一个似乎仍然可以在 Mac OS X 上运行,但是它们似乎都不再适用于我在 AWS 中的 Ubuntu 14.04 实例。是什么让它echo或cat不再可以访问这些环境变量?更奇怪的是,当我将 env vars 传递给 NodeJS 应用程序时,我似乎没有任何问题:
cat <<EOF > test.js
console.log('X is ' + process.env.X);
EOF
X=123 node test.js
Run Code Online (Sandbox Code Playgroud)
这似乎也适用于 bash 脚本:
cat <<EOF > test.sh
echo X is \$X
EOF
chmod +x test.sh
X=123 ./test.sh
Run Code Online (Sandbox Code Playgroud) 多年来,我习惯DESTDIR=/somewhere make install在安装操作之前设置临时路径以进行测试,因此我天真地认为它适用于任何命令行。
FOO=bar echo $FOO但令我惊讶的是,它不适用于!
看起来效果FOO=bar bash -c 'echo $FOO'很好。
有人可以告诉我这背后的原因吗?如果每次都必须使用after形式,那就有点麻烦了。
在研究有关 Bash 子 shell 的更深入信息时,我遇到了一个有趣的执行,我想了解它为何有效。执行涉及将字符串分配给变量,然后在man调用时使用该变量,链接到原始示例。我已经读过为什么LESS在该示例中使用特定变量(在许多发行版中man作为less默认分页器),我不明白的是命令执行后的变量赋值如何在没有任何类型的分隔元字符的情况下工作。
LESS=+/'OPTIONS' man manman直接在该部分下打开命令的手册页OPTIONS。它适用于直接使用less太打开的文件(这使我相信该LESS变量的使用less方式与在“会话”中进行正则表达式搜索相同less)。该LESS变量不会被导出,它永远不会保存在当前的 shell 环境中(执行不会echo $LESS返回任何内容),那么如何less捕获该值呢?
为什么这有效,但不是类似的东西foo='hello' echo $foo?;仅当变量赋值和命令执行之间包含命令分隔符 ( ) 时,这种情况才有效。我什至尝试过foo=+'hello' echo $foo以防万一=+在 Bash 中做了一些我不知道的事情,但输出没有变化。
欢迎任何解释或阅读材料!
为什么我的 zsh 会这样?
% MYVAR="hi" echo $MYVAR
% MYVAR="$(date)" echo $MYVAR
% export MYVAR="$(pwd)"
% echo $MYVAR
/Users/theonlygusti
Run Code Online (Sandbox Code Playgroud)
为什么同一行环境变量显然没有设置?
AFAIK,cat是一个外部命令,它在执行时分叉出一个新进程,就像sh -c或执行脚本一样。话虽如此,我希望cat使用它的命令环境,因为它被其他外部命令使用,比如
f=test.txt sh -c 'cat "$f"'
Run Code Online (Sandbox Code Playgroud)
这不应该显示文件的内容吗
f=test.txt cat $f
Run Code Online (Sandbox Code Playgroud)
?
注意:我不是在问什么是 someVariable=someValue command. 我在问为什么第一个例子使用它的命令变量而不是第二个。变量扩展在第二个例子中发生的方式它应该在第一个例子中发生。
bash ×6
shell ×3
shell-script ×3
assignment ×1
cat ×1
command-line ×1
less ×1
macos ×1
shellshock ×1
variable ×1
zsh ×1