Articles of bash

以符号表示法(包括粘滞位)的unix权限转换器

我需要使用像这样的符号表示法来获取文件或文件夹更具 human readable格式的Access rights in u=rwx,g=srwx,o-rwx (可能是sticky bits) 使用stat –format '%a'格式stat –format '%a' ,我得到格式为2770 ,八进制格式的结果 使用stat –format '%A' ,我得到一个格式为drwxrws—的结果,可读性强 我需要一个命令来获得像u=rwx,g=srwx,o-rwx (与chmod symbolic modes兼容) [u|g|o] :用于user / group / other或者全部 [=] :授予的权利 [rwxst] :授予的订单重要性的列表 [-rwx] :对于被撤销的权利(如果没有授予权利) 我已经尝试过(但它不处理所有的情况下,特殊的粘性位): stat –format '%A' temp | sed -E 's/^.(…)(…)(…)/u=\1,g=\2,o=\3/g' | # split by triplet sed 's/=—/-rwx/g' | # revoker grants […]

用日志中的主机名replaceIP

我正在寻找一个bash脚本来读取日志并用主机名replaceIP地址。 有没有人有任何想法如何做到这一点?

redirect之后的一个参数能做什么吗?

redirect被忽略之后是否有任何争论,还是会有意想不到的后果? 我很惊讶地发现,我在bash脚本中犯的一个错字没有任何区别,因为它是在redirect之后指定的。 比如我预料它会抱怨这样的事情 ./foo.sh > foo2.log whoops I made a typo 但它不会抛出任何错误。 我不得不添加一个分号来让它像命令和错误一样运行 ./foo.sh > foo2.log; whoops I made a typo 更令我吃惊的是,linuxredirect后并没有放弃,比如说 ./foo.sh > foo2.log whoops I made a typo > command_is_still_going.log 是绝对好的,command_is_still_going.log仍然被创build “哎呀,我犯了一个错字”的说法完全被忽略了,还是会导致一些不必要的行为? 因为我倾向于使用这个很多。

BASH | 如何获取bash中一行的字段数(使用剪切?)

鉴于以下数据: field1;field2;field3;field4; 如何获得这一行的字段数? 例如,这个命令应该在这里给出4 。 实际上,每一行我没有相同数量的内容,但我需要全部归还。 一旦我设法计算字段的数量,我也将设法做一个循环来获取它们。 (操作系统:Ubuntu 13.04) 预先感谢您的帮助。

空白在bash中究竟意味着什么?

我有这样的东西: projectName= echo $tempPBXProjFilePath | sed "s/.*\/\(.*\)\.xcodeproj.*$/\1/g"; 我想从$tempPBXProjFilePath提取子string。 这是正确的。 但是,如果我这样写: projectName=echo $tempPBXProjFilePath | sed "s/.*\/\(.*\)\.xcodeproj.*$/\1/g"; 这是错误的。 区别在于variables之后的空格。 我知道直接variables之后没有空格。 但等号后的空格是什么意思? 有没有地方空白有特殊的意义?

有没有任何标准的机制或约定来防止Bash环境variables名称冲突?

这个网站http://www.tldp.org/LDP/abs/html/gotchas.html#PARCHILDPROBREF表明一个脚本不能改变它的父母的环境variables。 所以,(除非是脚本来源),脚本不会在其父环境中意外地更改一个命名的环境variables。 但是,如果程序依赖于声明的环境variables,则可能会发生名称空间冲突。 例如,假设我不知道vim使用环境variables名称“VIMRUNTIME”。 而巧合的是,我碰巧把这个环境variables名称用于我自己的无关的目的。 然后vim会从VIMRUNTIME环境variables中获取垃圾。 是否有任何机制或标准,众所周知的命名约定来避免这种types的命名空间冲突? 当然,我可以做一些像使用某种前缀命名所有环境variables的东西。 但是我想知道是否有这方面的知名的正式标准。 或者,在Bash中有没有find某种名称空间机制? 鼓励在其他相关陷阱的意见。

为什么我能够直接从bash执行JAR?

我是一个长期的Java人,并且知道在JAR中的MANIFEST.MF文件中引用的主类运行JAR的方法很简单: java -jar theJar.jar 我正在使用它来启动Fabric3服务器(包含在标准发行版的bin/server.jar中)。 我注意到,当我从分发tarball解压缩它,它被标记为可执行文件。 一时兴起,我试了一下 ./server.jar 从我的bash命令行(Ubuntu 10.10中的bash版本4.1.5),并且看,服务器启动,就好像我input了正常的java -jar …命令。 JAR的结构像一个普通的JAR; 我做了一个head ,没有#! 命令在前几个字节,所以bash不应该神奇地知道启动一个Java虚拟机,对吧? 或者,这个版本的bash增加了正确启动JAR的能力吗? 询问的头脑想知道…

如何将目录复制到使用bash安装的目录中?

假设嵌套的目录foo/bar和一个空目录dest 。 我想调用像install foo dest这样的dest包含目录foo/bar 。 我已经尝试了以下内容: install foo dest => install:省略目录“foo” install -d foo dest =>没有任何反应

将引用的parameter passing给shell脚本并保持引用

我试图重新使用发送到我的脚本的参数作为我在脚本中执行的命令的参数。 看下面的例子,我执行mailx 。 庆典 $./myscript.sh "My quoted Argument" myscript.sh mailx -s $1 这最终被执行为: mailx -s My Quoted Argument 。 我尝试了"$1" ,但我的报价被扔掉了。 (错误的语句,请阅读下面的答案) 我试过""$1""但是我的报价被扔掉了。 我试图做'$1'但这是强烈的引用,所以1美元永远不会得到解释。 我意识到我可以做$@ ,但是这给了我所有的参数。 ….你得到的图片 任何帮助,将不胜感激!

GNU并行的“find”和“ls”

我正在尝试使用GNU parallel将大量文件发布到Web服务器。 在我的目录中,我有一些文件: file1.xml file2.xml 我有一个如下所示的shell脚本: #! /usr/bin/env bash CMD="curl -X POST -d@$1 http://server/path" eval $CMD 脚本中还有一些其他的东西,但这是最简单的例子。 我试图执行以下命令: ls | parallel -j2 script.sh {} 这是GNU parallel页面显示的“正常”方式来操作目录中的文件。 这似乎将文件的名称传递到我的脚本,但curl抱怨说,它不能加载传入的数据文件。但是,如果我这样做: find . -name '*.xml' | parallel -j2 script.sh {} 它工作正常。 ls和find是如何将parameter passing给我的脚本的? 或者我需要在脚本中另外做些什么?