标签: bash

如何将多个 Bash 命令粘贴到 shell 中而不丢失一些?

复制粘贴您在网站上找到的一系列 Bash 命令是很好的。但是根据命令,有时您会丢失一些。也许他们被从标准输入读取的程序吞没了,或者也许有另一种解释。

所以我有时会这样做:

$ bash <<EOF
cmd2
...
EOF
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?一些 Bash 选项?SSH 选项?(我的设置是在 Ubuntu 服务器上运行的 Bash,我从标准 OS X 终端通过 SSH 连接到该服务器。不确定其中有多少相关。)

编辑

例子

为了响应对具体示例的请求,这里有一个。我将以下四行粘贴到一个 SSH shell(来自我的 Snow Leopard 桌面)中,该 shell 连接到一个在 OpenStack VM 上运行的股票 Ubuntu Quantal,在 Bash shell 中。

sudo apt-get install -y r-base gdebi-core
sudo apt-get install -y libapparmor1 # Required only for Ubuntu, not Debian
wget http://download2.rstudio.org/rstudio-server-0.97.314-amd64.deb
sudo gdebi rstudio-server-0.97.314-amd64.deb
Run Code Online (Sandbox Code Playgroud)

前两个命令执行(成功),而后两个命令显然从未被服务器接收(或者至少从未被 Bash 处理)。

ssh bash shell macos

6
推荐指数
2
解决办法
4579
查看次数

如何恢复已关闭窗口的 bash 输出?

我在 bash 终端中运行了一个特定的程序,但在读取其输出之前我错误地关闭了它。是否可以通过查看某种 bash 标准输出历史日志来恢复发送到标准输出的信息?

非常感谢。

bash shell command-line

6
推荐指数
1
解决办法
6985
查看次数

Bash 自动完成变量在末尾添加了额外的空格

当我执行 bash 变量的自动完成时,最后会添加一个额外的空白字符。

所以这:

$FO[TAB]
Run Code Online (Sandbox Code Playgroud)

变成这样:

$FOO" " 
Run Code Online (Sandbox Code Playgroud)

我添加了引号以表示空白。问题是我们使用的一些变量是目录,空格很烦人,因为它必须被删除并且必须输入 / 。是否有可能以某种方式配置这样的行为

所以这:

$FO[TAB]
Run Code Online (Sandbox Code Playgroud)

变成这样:

$FOO/
Run Code Online (Sandbox Code Playgroud)

或这个:

cd $FO[TAB]
Run Code Online (Sandbox Code Playgroud)

变成这样:

cd $FOO/
Run Code Online (Sandbox Code Playgroud)

bash tab-completion

6
推荐指数
1
解决办法
1527
查看次数

如何正确创建符号链接?

设想 :

  1. 我在一个不在 PATH 中的地方
  2. 我有一个dofoo可执行的文件名
  3. 我想创建/usr/bin指向dofoo当前目录的符号链接

很难获得基础知识。我可以做

$ cd /usr/bin
$ sudo ln -s /previous/path/dofoo
$ cd /previous/path
Run Code Online (Sandbox Code Playgroud)

但我想用单个命令来完成。这是我尝试过的(假设我在 /previous/path 中):

$ sudo ln -s dofoo /usr/bin/dofoo
$ /usr/bin/dofoo
bash: /usr/bin/dofoo: Too many levels of symbolic links
Run Code Online (Sandbox Code Playgroud)

linux bash symbolic-link

6
推荐指数
1
解决办法
3929
查看次数

将 Git 存储库和分支添加到 Tmux 状态行

我找到了一个 Tmux 配置文件,它显示了如何将 Git 分支添加到 Tmux 状态行,但是它只显示[[ branch ]]我是否在 Git 存储库中。我不确定这是否需要git-completion,但如果需要,我什至不确定它是否已安装,因为它是 Ubuntu 中的“虚拟”包(前导“v”表示“虚拟”):

$ aptitude search git-completion
v   git-completion

$ sudo apt-get install git-completion
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'git' instead of 'git-completion'
git is already the newest version.
Run Code Online (Sandbox Code Playgroud)

我如何将分支以及 CWD 的 git repo 名称添加到 Tmux 状态行?

谢谢。

linux bash git command-line tmux

6
推荐指数
3
解决办法
7868
查看次数

`vi` 命令不会在 OS X 上打开新安装的 Vim 7.4

我刚刚使用 Homebrew 在我的 MacBook 上安装了 Vim 7.4。当我vim在命令行输入时,它成功进入了Vim 7.4,但是当我使用时vi我仍然得到旧的7.3。

为了安装 Vim 7.4,我使用了这个命令:

brew install vim --override-system-vi
Run Code Online (Sandbox Code Playgroud)

当我这样做时:

$ which vi
/usr/local/bin/vi
Run Code Online (Sandbox Code Playgroud)

当我在 shell 中执行此路径时,/usr/local/bin/vi它确实打开了 7.4。所以我认为它可能是一个别名,但alias vi没有找到任何东西。

我对此感到非常困惑,我不知道为什么会发生这种情况。有谁知道为什么会发生这种情况以及如何解决?我当然可以vi给 to取一个别名,vim但我想知道为什么它现在这样工作。

linux bash vim

6
推荐指数
1
解决办法
4420
查看次数

readline / bash:如何映射 Escape 键和箭头键?

从另一个命令行驱动的软件中,我习惯了以下行为:向上/向下箭头浏览命令历史记录,匹配​​与当前行中输入的字符匹配的行,Esc 删除到目前为止输入的所有内容在当前行。我试图让 bash(通过 readline)做同样的事情。这是我放入 .bashrc 的内容:

bind 'Escape: kill-whole-line'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
Run Code Online (Sandbox Code Playgroud)

由于 Escape="\e" 的映射与转义序列 "\e[A" 和 "\e[B" 的映射的干扰,行为不符合预期。

我的问题:有没有办法使这项工作?一种可能性是基于时间的,即如果 \e 后面紧跟着另一个键,则它被视为序列的一部分,但如果在一些短暂的延迟期间没有其他任何东西出现,则它本身被视为一个键。然而,阅读 bash 和 readline 文档我无法想出这样的事情。

附带问题:是否有一个现代终端“模拟器”实际上并不试图模拟历史机器的复杂行为,而是为在其中运行的程序提供有关按下的键的明确信息?这也将启用诸如区分 CTRL-A 和 CTRL-SHIFT-A 之类的东西......我在 KDE 的 Konsole(其行为类似于 xterm)和 Linux 控制台上测试了这些东西。

terminal keyboard-shortcuts bash command-line readline

6
推荐指数
1
解决办法
1989
查看次数

带有更多小数位的“du -h”

我正在开发一个用 bash 编写的小实用工具,它为我提供了有关 Linux 上游戏服务器的一些信息。因此,我需要能够显示文件内容的大小。

我现在正在这样做:

du -Lshc *
Run Code Online (Sandbox Code Playgroud)

它几乎完美!唯一的缺陷是它显示如下内容:

21G     backups
22G     server
8.0K    start.sh
151M    world.zip
43G     total
Run Code Online (Sandbox Code Playgroud)

这很好,但我想要更多的数字。这意味着它应该是这样的:

21.587G     backups
22.124G     server
8.089K      start.sh
151.198M    world.zip
43.436G     total
Run Code Online (Sandbox Code Playgroud)

有没有可能做到这一点?

我不介意使用复杂的命令,因为我在.sh文件中使用它,所以我不会每次都手动输入。

linux bash format du

6
推荐指数
1
解决办法
3183
查看次数

在 Bash 中以大小写方式删除文件扩展名

我想通过basename在 Bash 脚本中使用来删除文件的后缀。该命令仅以区分大小写的方式删除后缀。

如何不区分大小写地删除扩展名?

bash file-extension

6
推荐指数
2
解决办法
3998
查看次数

递归差异和符号链接

我正在尝试使用 (well) 区分两个目录diff。但是,diff实际上遵循符号链接并比较目标文件之间的差异。我似乎找不到不这样diff做的方法。相反,我想知道的是目标是否相同(或不同)。换句话说,如果符号链接指向同一个文件,(在我看来)它们是相同的,否则它们是不同的,这就是我想diff在递归调用期间遇到符号链接时告诉我的全部内容。

我试过在网上查找,但我要么找到与单独处理符号链接有关的主题,要么完全忽略它们。

unix bash diff

6
推荐指数
2
解决办法
3347
查看次数