复制粘贴您在网站上找到的一系列 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 处理)。
我在 bash 终端中运行了一个特定的程序,但在读取其输出之前我错误地关闭了它。是否可以通过查看某种 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) 设想 :
dofoo可执行的文件名/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) 我找到了一个 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 状态行?
谢谢。
我刚刚使用 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但我想知道为什么它现在这样工作。
从另一个命令行驱动的软件中,我习惯了以下行为:向上/向下箭头浏览命令历史记录,匹配与当前行中输入的字符匹配的行,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 控制台上测试了这些东西。
我正在开发一个用 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文件中使用它,所以我不会每次都手动输入。
我想通过basename在 Bash 脚本中使用来删除文件的后缀。该命令仅以区分大小写的方式删除后缀。
如何不区分大小写地删除扩展名?
我正在尝试使用 (well) 区分两个目录diff。但是,diff实际上遵循符号链接并比较目标文件之间的差异。我似乎找不到不这样diff做的方法。相反,我想知道的是目标是否相同(或不同)。换句话说,如果符号链接指向同一个文件,(在我看来)它们是相同的,否则它们是不同的,这就是我想diff在递归调用期间遇到符号链接时告诉我的全部内容。
我试过在网上查找,但我要么找到与单独处理符号链接有关的主题,要么完全忽略它们。