相关疑难解决方法(0)

“终端”、“外壳”、“tty”和“控制台”之间的确切区别是什么?

我认为这些术语在松散使用时几乎指的是同一件事:

  • 终端
  • 贝壳
  • 打字机
  • 安慰

这些术语中的每一个究竟指的是什么?

shell terminal tty terminology console

1433
推荐指数
10
解决办法
42万
查看次数

忘记在 bash/POSIX shell 中引用变量的安全隐患

如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。

在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?何时需要双引号?shell 变量的扩展以及 glob 和 split 对其的影响引用vs 不带引号的字符串扩展)

自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。

现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。

根据我的经验,主要有 3 类人会省略引用他们的变量:

  • 初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。

  • 健忘的人。

  • 即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

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

使用先前命令输出中的文本

编辑 2015 年 4 月:如果您有同样的问题,我建议您也查看http://xiki.org/


我知道这不是终端的工作方式,但我发现自己经常希望有一种简单的方法来使用文本(复制、修改等),这些文本已经存在于我的终端窗口历史记录中,来自之前的一些命令输出。

我是这样想象的:

我正在我的 bash shell 中输入一个命令,但我意识到我需要输入一些已经出现在屏幕上方几行的内容。我可以伸手去拿鼠标并选择它,但我讨厌那样。此刻我真正希望的是我的整个终端变成一个巨大的 Vim 缓冲区,所有这些:提示、我输入的命令以及这些命令的输出。一切。然后我可以跳几行,也许编辑一下,然后猛拉一些文本。然后,返回 bash shell 模式并将我拉到的任何内容粘贴到当前命令行中。

我知道有一些选择:

  • 自然地,将我需要的文本直接从某个命令的输出传送到一个文件,或者直接传送到下一个命令。但是为此,您必须提前计划或重新执行历史记录中的命令(假设输出在调用之间不会改变)。

  • 到达鼠标并选择要复制的文本。跛脚,烦人,我希望我没有这样做,(这不是 GUI stackexchange 站点,是吗?=)

  • 使用我的 (Mac OS X) 终端应用程序的“将文本导出为...”选项,并将终端文本保存到文件中。然后打开文件并使用它。差不多,但是为什么要执行保存到磁盘上的文件的步骤?

所以问题是:在这种情况下你会怎么做?在这种情况下,是否有任何技巧、工具、外壳功能可能有用?您只是辞职使用鼠标还是重新输入您需要输入的内容?

可能是问题在于我不是在以“unix 方式”做事,但是拜托,这是 2010 年,我无法轻松复制距光标几行远的一些文本?

command-line osx bash io-redirection

16
推荐指数
3
解决办法
4627
查看次数

Bash:捕获/使用标准输出中的最后(或第 N)行

询问

我使用 Bash。当我在寻找文件时,我通常会执行以下操作:

find -name stackexchange.hs

结果通常如下所示:

/youre/the/man/now/dog/stackexchange.hs
/you/are/no/longer/the/dog/dog/stackexchange.hs
/this/is/the/file/i/want/stackexchange.hs
Run Code Online (Sandbox Code Playgroud)

然后我想执行以下操作之一:

  • 选项 1:在vim 中打开结果列表中的最后一项。
  • 选项 2:在vim 中打开结果列表中的第 N 项。

目前,我用鼠标剪切和粘贴。这让我想到了我的问题

  1. 是否有一个简单的单线来完成选项 1 和 2?请注意,这是find命令之后发生的。
  2. 有没有办法在某种 bash 向量/数组中从标准输出中捕获 N 行?

理想用途

$ find -name am_i_really_all_alone.txt
./borges/library/you_are_not_alone.txt
./borges/library/am_i_really_all_alone.txt
$ vim (N)
Run Code Online (Sandbox Code Playgroud)

(语法和语义可能不同,但你明白了)

相似

似乎有几个类似的问题。以下是我感知到的差异(我愿意接受启蒙):

command-line bash

12
推荐指数
2
解决办法
2842
查看次数

是否可以在上一个/下一个命令提示符之间跳转?

我在 OS X Terminal.app 中使用 zsh 并且很长一段时间以来,我一直渴望有一种方法可以在终端输出中的上一个/下一个提示之间来回跳转。

这样做的一个方便之处是能够在每个命令的输出结束时查看(并跟踪错误);例如。当您使用 ./configure 从源代码构建东西时;制作; 进行安装。注意:我显然不是指在命令历史记录中来回跳转,而是指一种查看每个命令输出结尾的方法。

有没有人在 *nix(最好也是 Mac)世界中听说过这样的功能?它是否需要某种以操作系统为中心的终端插件,还是可以通过可以绑定到键盘快捷键的 shell 脚本以编程方式完成?也许只有我一个人在想这个?:)

prompt command-history terminal

8
推荐指数
1
解决办法
1134
查看次数

bash:获取最后一个标准输出

可能的重复:
如何重用命令行的最后一个输出?

如果我例如输入

aptitude search dia
Run Code Online (Sandbox Code Playgroud)

我得到了很多不相关的东西。那时,我怀疑| head| grep -w dia会简化结果(如果我想过的话)。我可以输入!! | head!! | grep -w dia但然后重新执行搜索。但这是不必要的;我对那部分已经很满意了。那么,有没有办法做喜欢,most_recent_stdout | whatever

(请注意,这只是一个例子,所以我不是在寻找 aptitude 选项或类似的东西。)

bash

5
推荐指数
1
解决办法
4967
查看次数