标签: shell

如何测试变量是否为空或仅包含空格?

以下 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)

“我不是零”是输出。

如何更改测试以将仅包含空格字符的变量视为空?

shell bash string shell-script

290
推荐指数
5
解决办法
53万
查看次数

如何从历史记录中删除一行?

我在 Mac OSX 上工作,所以我想我在使用 bash...?

有时我会输入一些我不想被历史记住的东西。如何删除它?

command-line shell bash command-history

285
推荐指数
7
解决办法
30万
查看次数

为您的终端和 shell 环境着色?

我大部分时间都在 Unix 环境中工作并使用终端模拟器。我尝试在命令行上使用颜色,因为颜色使输出更加有用和直观。

有哪些选项可以为我的终端环境添加颜色?你用什么技巧?你遇到过哪些陷阱?

不幸的是,对颜色的支持因终端类型、操作系统、TERM 设置、实用程序、错误实现等而异。

经过大量实验,以下是我的设置中的一些提示:

  1. 我倾向于设置TERM=xterm-color,大多数主机(但不是全部)都支持。
  2. 我在许多不同的主机、不同的操作系统版本等上工作。我使用 macOS?X、Ubuntu Linux、RHEL/CentOS/Scientific Linux 和 FreeBSD 中的所有内容。如果可能的话,我试图让事情保持简单和通用。
  3. 我使用 GNU 做了很多工作screen,这增加了另一层乐趣。
  4. 许多操作系统dircolors默认设置类似和,我不想在一百个不同的主机上修改它。所以我尝试坚持使用默认值。相反,我调整了终端的颜色配置。
  5. 对某些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。

shell colors bash prompt

284
推荐指数
9
解决办法
81万
查看次数

$(stuff) 和 `stuff` 有什么区别?

命令替换有两种语法:美元括号和反引号。运行top -p $(pidof init)top -p `pidof init`给出相同的输出。这两种做同样事情的方式,还是有区别?

command-line shell command-substitution

283
推荐指数
5
解决办法
3万
查看次数

为命令的每一行输出添加时间戳

我希望在命令的每一行输出前添加一个时间戳。例如:

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)

...前缀的时间是打印行的时间。我怎样才能做到这一点?

shell timestamps

282
推荐指数
8
解决办法
16万
查看次数

分段错误如何在后台工作?

除了“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)

回到第一个,我猜。我刚刚证明了不是外壳执行此操作,而是下面的系统。“分段错误”是如何打印出来的?“谁”在做?内核?还有什么?信号及其所有副作用如何从硬件传播到程序的最终终止?

shell kernel signals segmentation-fault

272
推荐指数
4
解决办法
4万
查看次数

如何在命令行上设置环境变量并让它出现在命令中?

如果我跑

export TEST=foo
echo $TEST
Run Code Online (Sandbox Code Playgroud)

它输出 foo。

如果我跑

TEST=foo echo $TEST
Run Code Online (Sandbox Code Playgroud)

它不是。如何在不使用导出或脚本的情况下获得此功能?

shell echo environment-variables

266
推荐指数
4
解决办法
44万
查看次数

bash 中的“eval”命令是什么?

你可以用eval命令做什么?为什么有用?它是 bash 中的某种内置函数吗?没有man它的页面。。

shell bash eval

261
推荐指数
7
解决办法
65万
查看次数

如何转到终端中的上一个工作目录?

在终端中,如何定义一个键以转到使用cd命令更改目录时所在的上一个目录?

例如,I'm in /opt/soft/binand I cdinto/etc/squid3并且我想回到第一个目录。

shell cd-command

259
推荐指数
4
解决办法
27万
查看次数

如何获取当前工作目录?

我想要一个将当前工作目录带到变量的脚本。需要目录的部分是这样的dir = pwd。它只是打印pwd如何将当前工作目录放入变量中?

shell scripting bash directory

256
推荐指数
4
解决办法
93万
查看次数