以下 bash 语法验证是否param不为空:
[[ ! -z $param ]]
Run Code Online (Sandbox Code Playgroud)
例如:
param=""
[[ ! -z $param ]] && echo "I am not zero"
Run Code Online (Sandbox Code Playgroud)
没有输出,很好。
但是当param除了一个(或多个)空格字符为空时,情况就不同了:
param=" " # one space
[[ ! -z $param ]] && echo "I am not zero"
Run Code Online (Sandbox Code Playgroud)
“我不是零”是输出。
如何更改测试以将仅包含空格字符的变量视为空?
我在 Mac OSX 上工作,所以我想我在使用 bash...?
有时我会输入一些我不想被历史记住的东西。如何删除它?
我大部分时间都在 Unix 环境中工作并使用终端模拟器。我尝试在命令行上使用颜色,因为颜色使输出更加有用和直观。
有哪些选项可以为我的终端环境添加颜色?你用什么技巧?你遇到过哪些陷阱?
不幸的是,对颜色的支持因终端类型、操作系统、TERM 设置、实用程序、错误实现等而异。
经过大量实验,以下是我的设置中的一些提示:
TERM=xterm-color,大多数主机(但不是全部)都支持。screen,这增加了另一层乐趣。dircolors默认设置类似和,我不想在一百个不同的主机上修改它。所以我尝试坚持使用默认值。相反,我调整了终端的颜色配置。对某些Unix 命令(ls, grep, less, vim)和Bash 提示符使用颜色。这些命令似乎使用标准的“ ANSI 转义序列”。例如:
alias less='less --RAW-CONTROL-CHARS'
export LS_OPTS='--color=auto'
alias ls='ls ${LS_OPTS}'
Run Code Online (Sandbox Code Playgroud)我会发布我的.bashrc并回答我自己的问题 Jeopardy Style。
命令替换有两种语法:美元括号和反引号。运行top -p $(pidof init)并top -p `pidof init`给出相同的输出。这两种做同样事情的方式,还是有区别?
我希望在命令的每一行输出前添加一个时间戳。例如:
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
会成为
[2011-12-13 12:20:38] foo
[2011-12-13 12:21:32] bar
[2011-12-13 12:22:20] baz
Run Code Online (Sandbox Code Playgroud)
...前缀的时间是打印行的时间。我怎样才能做到这一点?
除了“CPU 的 MMU 发送信号”和“内核将其定向到违规程序并终止它”之外,我似乎找不到任何关于此的信息。
我认为它可能将信号发送到外壳,外壳通过终止违规进程和打印来处理它"Segmentation fault"。所以我通过编写一个我称之为crsh(废话 shell)的极简 shell 来测试这个假设。除了获取用户输入并将其提供给system()方法之外,此外壳不执行任何操作。
#include <stdio.h>
#include <stdlib.h>
int main(){
char cmdbuf[1000];
while (1){
printf("Crap Shell> ");
fgets(cmdbuf, 1000, stdin);
system(cmdbuf);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我在一个裸终端中bash运行了这个 shell(没有在下面运行)。然后我继续运行一个产生段错误的程序。如果我的假设是正确的,这将 a) 崩溃crsh,关闭 xterm,b) 不打印"Segmentation fault",或 c) 两者兼而有之。
braden@system ~/code/crsh/ $ xterm -e ./crsh
Crap Shell> ./segfault
Segmentation fault
Crap Shell> [still running]
Run Code Online (Sandbox Code Playgroud)
回到第一个,我猜。我刚刚证明了不是外壳执行此操作,而是下面的系统。“分段错误”是如何打印出来的?“谁”在做?内核?还有什么?信号及其所有副作用如何从硬件传播到程序的最终终止?
如果我跑
export TEST=foo
echo $TEST
Run Code Online (Sandbox Code Playgroud)
它输出 foo。
如果我跑
TEST=foo echo $TEST
Run Code Online (Sandbox Code Playgroud)
它不是。如何在不使用导出或脚本的情况下获得此功能?
你可以用eval命令做什么?为什么有用?它是 bash 中的某种内置函数吗?没有man它的页面。。
在终端中,如何定义一个键以转到使用cd命令更改目录时所在的上一个目录?
例如,I'm in /opt/soft/binand I cdinto/etc/squid3并且我想回到第一个目录。
我想要一个将当前工作目录带到变量的脚本。需要目录的部分是这样的dir = pwd。它只是打印pwd如何将当前工作目录放入变量中?
shell ×10
bash ×5
command-line ×2
cd-command ×1
colors ×1
directory ×1
echo ×1
eval ×1
kernel ×1
prompt ×1
scripting ×1
shell-script ×1
signals ×1
string ×1
timestamps ×1