Questions tagged «bash»

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

4
为什么`==`在zsh和bash中的[[…]`内部表现不同?
在执行此操作时,我得到了期望的结果bash: [ "a" == "a" ] && echo yes 它给了我yes。 但是当我在中执行此操作时zsh,我得到以下信息: zsh: = not found 为什么同一命令(/usr/bin/[)在不同的Shell中表现不同?
9 bash  zsh  test 

6
使用猫通配符打印强制换行
我想在bash中使用带有通配符的cat以便将多个小文件(每个文件是一个句子)打印到标准输出。但是,单独的文件内容不是用换行符分隔的,为了方便阅读,我希望这样做。 如何在此命令中添加某种文件分隔符?

5
在必要的目录中运行终结器,然后运行必要的命令
我想在特定目录(例如)中打开Terminator /home/downloads/,然后运行命令。 我通过此“自定义命令”完成了第一部分:cd /home/downloads; bash 终结者现在从该目录中启动,但是我该如何做第二部分? 既然终止程序已在downloads目录中启动,我想运行任何我想要的命令,例如lsor rake命令,或使用一些别名作为命令。我怎样才能做到这一点? 我在终结器中按鼠标右键,然后选择“参数”,“布局”,然后在“自定义命令”部分添加文本。 终止程序启动后,必须自动执行所有这些操作。

2
在shell中间接扩展变量
我需要在bashShell中间接引用变量。 我基本上是想make通过写作做些什么$($(var))。 我尝试使用${$var}哪种方法是最直接的解决方案,bash但随后出现此错误: bash: ${$var}: bad substitution 有没有办法做到这一点? 我所试图做的是遍历所有参数($1,$2,$3,...)来使用迭代变量的程序并没有间接我不能做到这一点。

5
如何*可靠地*和*简单地*获得当前的shell解释器名称?
我正在寻找一种简单可靠的方法来从脚本或源文件(而不是从命令行)中获取当前shell的名称。我本来希望这样做,$(basename "$SHELL")但是如果我的登录外壳是zsh且我在some_script.sh中具有以下代码 this_shell=$( basename "$SHELL" ) echo "The Shell is $this_shell" echo "The Shell is $0" 并且我用bash some_script.sh它运行zsh,bash即使使用的解释器还是列出了/bin/bash。我不确定为什么外壳设计人员选择显示默认外壳而不是当前外壳,但这似乎就是我们所坚持的。 还有其他一些稍微相似的问题(此处和此处),但是它们的答案在许多方面都不够。 他们通常会假设用户试图弄清楚他们当前正在使用哪种交互式外壳,但这太疯狂了。我知道我要在其中键入命令的外壳程序-我需要可以在任何地方运行的代码,以便能够确定正在使用的外壳程序。 他们通常会提供几种不同的方法来尝试-就像您在命令行上一样,并且可以四处弄弄,直到了解到您正在使用bash为止-但是我需要一件在所有情况下都可靠的方法。 它们通常会提供脚本中完全没有用的东西,例如echo $0。如上面的脚本所示,该操作失败。(是的,它可以在交互式shell命令行中工作,但是为什么您不知道使用的是哪个shell?) 他们有时会提供一些命令(在我的有限测试中),这些命令包含正确的信息,例如ps -p $$,但是缺少跨平台,跨外壳兼容的sed / awk命令来通过管道传递该命令以获取外壳名称,而忽略随之而来的其他信息骑。 它们包括只能在几个shell上使用的东西,例如$BASH_VERSION和$ZSH_VERSION。我要支持尽可能多的炮弹可能,如fish,csh,tcsh。 如何可靠,准确地检测到任何 当前的外壳?我正在寻找可以在各种平台,脚本和尽可能多的shell中正常运行的东西1。 更新:当我发布此问题时,我希望外壳中内置一些功能来提供此信息,但事实并非如此。由于现在看来不可避免地要依赖Shell之外的东西,因此我应该更加明确地表明,我正在寻求跨平台解决方案(尽管我对上述其他答案表示反对,但如果您不这样做的话,可能会很容易错过它。没有仔细阅读问题)。 更新2 如果由于Stéphane的回答不是仅Linux,还是有人仍然认为这是仅Linux的问题的重复,那么这里就是我所要求的与他所提供的之间的区别。(请注意,他写的东西很巧妙,我没有敲门,但这并不能解决我的问题。) 我在寻找的东西简单和可靠的,那 可以添加到任何脚本或函数的定义(将由一个被采购.zshrc或.bash_profile分支或其他)。 您不能将他的脚本用作将解释器名称传递给调用脚本/函数的外部实用程序,因为它将始终由默认解释器解释并返回该名称。这使得很难或根本无法实现我的目的。如果可能的话,这仍然非常非常困难,答案中没有给出解决方案。因此他没有回答我的问题,因此不是重复的。 如果你想看到的东西,将工作,看看ShellDetective GitHub上。这样可以更容易地看到SE上已经存在的内容与该问题正在寻找的内容之间的差异(实际上是为了满足该问题的需求而编写的,而其他地方都未满足)。 (PS,如果您无法相信有这样的用例,请想象将这些函数派生到.zshrc,.bash_profile或.profile取决于正在使用的服务器以及可用的外壳的函数。它们的来源使其没有shebang行。如果它们可以在任何外壳中工作,则非常有用,但有时他们必须知道所处的外壳才能知道如何运行。) 1我不关心“贝壳”,它不是任何传统意义上的贝壳。我不关心有人为自己编写的shell。我只关心真正出现在外壳中的真实外壳,并且可以想象有人在登录某些服务器时可能会不得不使用的外壳,而他们不能在其中安装所需的任何外壳。
9 bash  shell  zsh 

1
Bash自动完成如何工作?
我可以理解bash自动完成功能适用于标准实用程序。但是,如何对自定义程序(例如Oracle SQL loader)自动完成? 在以下命令中,如果按Tab键,control=则它将自动完成为控制文件名: sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log 如何知道此时必须填充控制文件而不是其他文件?

3
超时功能返回值
我在debian上使用了超时功能,等待5秒钟等待我的脚本。效果很好,但我遇到的问题是我需要一个返回值。像1表示超时,0表示没有超时,我该怎么做? 看一下我的代码: timeout 5 /some/local/script/connect_script -x 'status' > output.txt # here i need the return of timeout 如您所见,我的connect_script -x'status'以字符串形式返回状态并将其打印到屏幕上(可能看不到)。此问题的背景是,如果服务器(用于connect_script)被冻结,则脚本将不执行任何操作。这就是为什么我需要超时的原因。当超时时,我想重新启动服务器。我可以做到,但是我不知道如何查看它是否超时...

4
仅使用bash将单个字符串拆分为字符数组
我想只使用bash 拆分'hello'成h e l l o数组,我可以用sed来做,sed 's/./& /g'但是我想知道当我不知道分隔符是什么,或者分隔符是任意的时,如何在Bash中将字符串拆分成数组单个字符。我不认为我不能${i// /}没有创造力,因为分隔符是一个未知数,我也不认为表达式接受正则表达式。我尝试将BASH_REMATCH与[[string =〜([az]。)。*]]结合使用,但是它没有按预期工作。仅使用bash来完成某种string.split()行为的正确方法是什么?原因是我试图在所有bash中编写rev实用程序: while read data; do word=($(echo $data|tr ' ' '_'|sed 's/./& /g')) new=() i=$((${#word[@]} - 1)) while [[ $i -ge 0 ]]; do new+=(${word[$i]}) (( i-- )) done echo ${new[@]}|tr -d ' '|tr '_' ' ' done 但是我使用了tr和sed,我想知道如何正确进行分割,然后将其修复为bash。纯娱乐。
9 bash  string  split 

1
cd到上一个目录,不回显目录名称
这个答案给了我cd -简化到Bash上一个目录的捷径。它确实有一个主要问题:它打印出要更改的目录,浪费了我的屏幕空间,因为该目录随后在下一行的提示中重复出现。 我知道我可以做cd $OLDPWD,在该答案中也提到了,cd - >/dev/null但这要打字得多。 在bash手册页中说: ...或-是第一个参数,并且目录更改成功后,新工作目录的绝对路径名将写入标准输出。 我怎样才能-不成为第一个论点?通过使用任何cd可选参数?还有其他抑制回波或最小化键入的方法,而无需在我使用的每台计算机上定义函数/别名?

2
bash如何在处理后从参数中删除选项
我记得在某个地方看到过一个bash脚本case,该脚本使用和shift浏览位置参数列表,遇到参数时解析带有参数的标志和选项,并在解析后将其删除以仅保留裸参数,然后由其余的参数处理。脚本。 例如,在解析的命令行时cp -R file1 -t /mybackup file2 -f,它将首先遍历参数,认识到用户已请求通过进入目录,通过来-R指定目标,-t /mybackup并通过来强制复制-f,然后将其从参数列表中删除,从而该程序file1 file2作为剩余参数进行处理。 但是我似乎无法记住/找到我所看到的任何脚本。我只是想能够做到这一点。我一直在各地搜索,并附加了我检查过的相关页面列表。 该网站上的一个问题专门询问了“顺序无关的选项”,但是单个答案和该问题的答案都没有考虑到像上面这样的情况,即选项与普通参数混合在一起,我认为这是该人特别提及与订单无关的选项的原因。 由于bash的内置getopts似乎停在第一个非选项参数上,因此它似乎不足以解决问题。这就是Wooledge BashFAQ的页面(见下文)解释如何重新排列参数的原因。但是我想避免创建多个数组,以防参数列表很长。 由于shift不支持从参数列表的中间弹出单个参数,因此我不确定实现我所要求的直接方法是什么。 我想听听是否有人有解决方案,可以从参数列表的中间删除参数,而无需创建一个新的数组。 我已经看过的页面: http://mywiki.wooledge.org/ComplexOptionParsing#Rearranging_arguments http://mywiki.wooledge.org/BashFAQ/035 在bash shell脚本中使用getopts获取长和短命令行选项 http://wiki.bash-hackers.org/scripting/posparams http://wiki.bash-hackers.org/howto/getopts_tutorial bash参数在$ @中的情况 在bash脚本中实现顺序独立选项的规范方法是什么? 如何处理Shell脚本中的开关?
9 bash  arguments 

1
从“ su -c”启动的命令中删除process-id
我在外壳中运行Java程序,并将process-id写入文本文件。所以当我这样做时: nohup java app.Main > /dev/null 2>&1 & echo $! > /var/run/app.pid 有用。但我真的想以其他用户身份运行它 su - appuser -c "nohup java app.Main > /dev/null 2>&1 &" echo $! > /var/run/app.pid 这行不通。是否可以通过-c选项启动命令的进程ID?
9 bash  shell  su 

2
当我使用sudo bash时保持别名
我有一台Centos 5.5服务器,该服务器具有自己的帐户别名命令。完成后,sudo bash我仍然可以使用这些别名,而不必将别名添加到根目录的.bashrc。 我还有另一台Centos 6.5服务器。但是,当我执行时sudo bash,它将不会使用我作为登录用户的别名。有谁知道我在哪里配置它以包括我使用时登录的用户的别名sudo bash?
9 bash  sudo 

2
将变量传递给使用'EOF'的bash脚本,并将该变量视为文字。
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 5年前关闭。 在此脚本中,我最终将“ $ 1”保存到/ test文件中。 #!/bin/bash cat > /test << 'EOF' $1 EOF 事实是..我需要保持 'EOF' 为'EOF',因为我的论点($ 1)包含美元符号。 但我需要保存该参数而不是保存$ 1

1
如何将bash关联数组往返于文本文件?
我想记住不同脚本运行之间的关联数组。到目前为止,我得到的是给定一个包含一个键/值对的文本文件: ( [james]=bond ) 是一个脚本,用于将其加载到关联数组中,添加到该数组中,然后以可以重定向到第二个文件的方式将其回显: #!/bin/bash file=`cat $1` key=$2 value=$3 declare -A row="$file" row[$key]=$value echo "(" for server in "${!row[@]}" do echo "[$server]=${row[$server]}"; done echo ")" 然后我可以将其运行为: ./arrays.sh file1 honey rider > file2 ; mv file2 file1 给予 ( [james]=bond [honey]=rider ) 然而,这似乎很笨拙。有没有更清洁的方法可以做到这一点?
9 bash 

3
如何将带有时间戳的命令历史连续输出到终端?
我使用一个简单的别名来启用一个或多个终端窗口中的命令“跟踪”: alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"' 然后,我将tail -f我的.bash_history文件放在工作区的另一个终端中,以立即获得反馈。我刚刚启用了无限的历史记录, 并export HISTTIMEFORMAT="[%F %T] "在.bashrc中更新了我的历史记录格式()。当然,该history命令会显示时间戳。但是历史文件本身的格式为: #1401234303 alias #1401234486 cat ../.bashrc 我该如何转换Unix时间并像显示命令一样将整个命令显示在一行上history,包括编号: 578 [2014-05-27 19:45:03] alias 579 [2014-05-27 19:48:06] cat ../.bashrc ...然后遵循。还是找到一种将history命令输出连续输出到终端的方法?

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.