Questions tagged «bash»

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

1
bash版本中带有多个参数的cd的不同行为
在这里张贴一些令我感到困惑的东西;将应用程序服务器从Jessie升级到Stretch破坏了bash脚本。 经过调查,我们将其范围缩小到cd命令行为的变化。我在这里不是在讨论脚本的操作是一个好主意,还是可以改进,我只是在关注行为更改/更改意识的思维方式。 杰西 $echo *-* xxxx-1.0b xxxx-run $cd *-* 光盘工作和光盘到第一个目录; 实际上,* -run是指向同一目录的符号链接。 伸展 $echo *-* xxxx-1.0b xxxx-run $cd *-* bash: cd: too many arguments bash 在Jessie中为4.3.30(1),在Stretch中为4.4.12(1)。 为什么Jessie和Stretch之间的行为发生了变化?
14 bash  cd-command 

3
管道B到D?-A && B || C | d
有没有一种方法可以重写命令结构,A && B || C | D以便将B或C管道传输到D? 使用当前命令,仅运行B或运行C和D。 例如:
14 bash  pipe 

3
如何将文件的不同行读取到不同变量?
我想将文本文件的不同行读取到不同的变量。例如 input.txt: line1 foo foobar bar line2 bar line3 foo line4 foobar bar 我想这个结果存储在变量var1,var2,var3和var4这样 var1=line1 foo foobar bar var2=line2 bar 等等。 有人可以告诉我它是如何完成的。我试图eval在for循环中使用。它似乎不起作用。
14 bash 

3
如何从bash的文件名扩展机制中排除某些文件?
我在根目录中有ubuntu文件系统目录,而我不小心将数百个文件复制到了根目录中。 我直觉地试图通过排除文件系统来删除复制的文件,例如 rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./. 但它不起作用。在删除整个目录时排除某些目录的正确方法是什么? 编辑:切勿在不知所措的情况下尝试此处的任何命令!

4
exit命令如何在Unix终端上工作?
有人可以解释一下该exit命令在Unix终端中如何工作吗? 搜索man exit 并which exit没有帮助,我遇到了以下问题。 在我的新Red Hat系统上安装了Anaconda和PyCharm的附加软件包后,我注意到当我打电话exit退出终端会话时,我会遇到一系列错误,然后终端按预期方式退出。错误似乎表明我对的呼叫exit正在触发rm ~/anaconda3/.../和rm ~/PyCharm/....,从而导致错误。所有目录也似乎是我为这些程序下载的软件包的位置(即numpy),请参见下文。 $ exit rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory ... ... 解决 在我的~/.bash_logout档案中,有一行 find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \; 注释掉该行可停止错误消息。它似乎可以搜索和删除所有临时文件。但是,它也尝试查找其中包含“核心”一词的目录,并将其删除。这是系统中的预设。

2
如何传递参数以在bash脚本中起作用?
我想编写一个可以从带有许多不同变量的脚本中调用的函数。由于某些原因,我在执行此操作时遇到很多麻烦。我读过的示例始终仅使用全局变量,但就我所知,这不会使我的代码更具可读性。 预期的用法示例: #!/bin/bash #myscript.sh var1=$1 var2=$2 var3=$3 var4=$4 add(){ result=$para1 + $para2 } add $var1 $var2 add $var3 $var4 # end of the script ./myscript.sh 1 2 3 4 我尝试$1在函数中使用诸如此类,但随后只需要调用整个脚本的全局范围即可。基本上,我正在寻找类似的东西$1,$2诸如此类,但是在函数的本地上下文中。如您所知,函数可以使用任何适当的语言来工作。



3
bash:我摔坏了[[<]]
我正在编写bash脚本,突然开始出现此行为: [[ 1 &lt; 2 ]]; echo $? # outputs 0 [[ 2 &lt; 13 ]]; echo $? # outputs 1 但-lt运作良好: [[ 1 -lt 2 ]]; echo $? # outputs 0 [[ 2 -lt 13 ]]; echo $? # outputs 0 我不小心&lt;以某种方式覆盖了吗? 这是我编写的用于测试此行为的脚本: #!/bin/bash for a in {1..5} do …
14 bash  test 

3
我如何在bash中使用二进制文件来逐字复制字节而不进行任何转换?
由于种种原因,我正在雄心勃勃地尝试将c ++代码转换为bash。 这段代码读取和处理特定于我的子字段的文件类型,该文件类型完全以二进制形式编写和结构化。我的第一个与二进制相关的任务是按原样复制标头的前988个字节,并将它们放入一个输出文件中,在生成其余信息时,我可以继续写这些输出文件。 我非常确定我当前的解决方案无法正常工作,实际上我还没有找到确定此问题的好方法。因此,即使它实际上写得正确,我也必须知道如何测试才能确定! 这就是我现在正在做的: hdr_988=`head -c 988 ${inputFile}` echo -n "${hdr_988}" &gt; ${output_hdr} headInput=`head -c 988 ${inputTrack} | hexdump` headOutput=`head -c 988 ${output_hdr} | hexdump` if [ "${headInput}" != "${headOutput}" ]; then echo "output header was not written properly. exiting. please troubleshoot."; exit 1; fi 如果我使用hexdump / xxd检出文件的这一部分,尽管我无法完全读取其中的大部分内容,但似乎有些问题。我编写的用于比较的代码仅告诉我两个字符串是否相同,而不告诉我是否按照我希望的方式复制它们。 有更好的方法来执行此操作吗?我可以简单地复制/读取本机二进制文件中的二进制字节以逐字复制到文件中吗?(最好也存储为变量)。
14 bash  binary  head 

4
Bash完成在centos 7上非常不完整
我已经使用安装了bash补全 yum install --enablerepo=epel bash-completion。虽然它适用于一些基本命令(git和yum),但我缺少大部分的完成程序。 我的 /etc/bash_completion.d包含以下内容: bash_completion.d] $ ls git iprutils redefine_filedir yum yummain.py yum-utils.bash 但是,我知道有bash_completion,例如make(已安装),还有更多,请与即 此处示例输出。 如何获得缺少的完成程序脚本?(最好使用yum,因此我不必手动更新它们) 如果很重要:制表符补全就可以了,但是我没有在.bashrc中采购任何东西。安装软件包后,它才开始工作。 更新:检查完bash的版本后,我已经安装了@fduff,提示我看到了以下内容: $ yum列表已安装| grep完成 bash-completion.noarch 1:2.1-6.el7 @base 但是尝试卸载它并迫使centos从epel存储库中安装bash_completion并sudo yum install --enablerepo=epel bash-completion --disablerepo=base产生package not found。 进一步检查发现,现在位于@base 中的新程序包将完成文件放入/usr/share/bash-completion/completions,但是我仍然缺少一些文件,即ssh和sudo(有些sudo command [tab]虽然command [tab]并没有完成的糟透了),但是我仍然找不到make(应列出中的目标Makefile) UPDATE2: 更改日志指出: 2013年11月1日星期五,彼得·斯托杜卡-2.1-6 仅安装不带“ tar”的可用补全(#810343-注释15),然后删除另一个补全。 2013年9月13日星期五罗马Rakus-2.1-5 添加了另外一个缺少的条件解析:#1007839 2013年9月13日星期五罗马Rakus-2.1-4 添加了条件以不添加某些命令的完成;程序包具有自己的完成名称:#1007839 因此,在我安装了bash_completion之后,重新安装sudo可以sudo完成安装,但是make运气不好。 …

5
如何找到长路径中第一个丢失的目录?
想象一下,我有一条不存在的路径: $ ls /foo/bar/baz/hello/world ls: cannot access /foo/bar/baz/hello/world: No such file or directory 但是,说/foo/bar 确实存在。有没有一种快速的方法可以让我确定baz路径的起点? 我正在使用Bash。
14 bash  shell  directory  ls 

8
检查变量是像Bourne这样的shell中的数组吗?
在像shell这样的Bourne中,它支持数组变量,我们可以使用一些解析来检查变量是否为数组。 下面的所有命令都在运行后运行a=(1 2 3)。 zsh: $ declare -p a typeset -a a a=( 1 2 3 ) bash: $ declare -p a declare -a a='([0]="1" [1]="2" [2]="3")' ksh93: $ typeset -p a typeset -a a=(1 2 3) pdksh 及其派生词: $ typeset -p a set -A a typeset a[0]=1 typeset a[1]=2 …
14 bash  shell  zsh  ksh  yash 

3
'find -exec'如何传递带有空格的文件名?
如果我的目录包含一些名称带有空格的文件,例如 $ ls -1 dir1 file 1 file 2 file 3 我可以将它们全部成功复制到另一个目录,如下所示: $ find dir1 -mindepth 1 -exec cp -t dir2 {} + 但是,的输出find dir1 -mindepth 1包含未转义的空格: $ find dir1 mindepth 1 dir1/file 1 dir1/file 3 dir1/file 3 如果我使用print0而不是print,则输出仍包含未转义的空格: $ find dir1 mindepth 1 -print0 dir1/file 1dir1/file 2dir1/file 3 要使用手动复制这些文件cp,我需要转义空格;但是,似乎当cp的参数来自时,这是不必要的find,而不管我是使用命令+还是\;命令的末尾。 …

2
删除大单词列表中重复项的最快方法?
我需要对大型单词表进行重复数据删除。我尝试了几个命令,并在此处和此处进行了一些研究,他们解释说,最快的重复数据删除单词列表的方法似乎是使用awk。 awk-&gt; O(n)吗?排序-&gt; O(n log n)? 但是我发现这似乎是不正确的。这是我的测试结果: sort -u input.txt -o output.txt 真实的0m12.446s 用户0m11.347s sys 0m0.906s awk '!x[$0]++' input.txt &gt; output.txt 真实的0m47.221s 用户0m45.419s sys 0m1.260s 因此,使用sort -u快3.7倍。为什么是这样?有没有更快的方法来进行重复数据删除? ***********更新******** 正如有人在评论中指出的那样,可能是我的词表已在某种程度上被排序。为了排除这种可能性,我使用此python脚本生成了两个单词表。 列表1 = 7 Mb 列表2 = 690 Mb 结果AWK: List1 实数0m1.643s 用户0m1.565s sys 0m0.062s List2 实际2m6.918s 用户2m4.499s sys 0m1.345s 结果排序: List1 …
14 bash  awk  performance  sort 

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.