Articles of bash

如何在CentOS 5.5上将bash升级到> = 4.1?

我有一个CentOS 5.5 VPS服务器。 我想使用RVM 。 根据运行RVM安装程序时的控制台输出,RVM需要bash> = 4.1。 我只是跑yum update 。 我的bash版本现在是3.2.25。 如果我明白yum是如何工作的,那就意味着3.2.25是“属于”我的CentOS版本的bash版本,它是我可以用yum获得的最新版本。 (对吗?或者我错了吗?) 我怎样才能在CentOS 5.5系统上得到这个结果? 为了澄清,我明白我可以下载源代码并进行安装,但是我很犹豫是要跳出yum的版本pipe理系统。 有没有一种方法来升级bash而不破坏yum?

把密码传给sudo su

我想sudo到不同的用户后ssh'ing到远程服务器,为此,我尝试了以下内容: cat remote-test.sh ssh -t -t [email protected] 'bash -s' << EOF /tmp/test.sh EOF 当我从development-server.net执行remote-test.sh时,我想把ssh作为abcuser的test-server.net,然后用sudo作为xyzuser。 cat /tmp/test.sh echo "password" | sudo -S su – xyzuser cd /tmp/some/directory 有人可以请教如何在脚本中做sudo su时传递密码。

在控制台上启用彩色的PHP CLI消息

如何在控制台(Mac OS X,来自MacPorts的最新PHP / Apache)上启用PHP CLI的彩色消息? export CLICOLOR=1 export LSCOLORS=gxfxcxdxbxegedabagacad 似乎不够,所有PHP CLI生成的输出在控制台上都是无色的。 如果结果看起来像XAMPP PHP实例那样会很好。 有任何想法吗?

编写一个更新提交代码副本的SVN钩子

我有一个SVN仓库中有很多子项目存储在它。 现在在我post-commit我只是循环遍历机器上的所有可能的文件夹,并运行svn update : REPOS="$1" REV="$2" DIRS=("/path/to/local/copy/firstproject" "/path/to/local/copy/anotherproject" … "/path/to/local/copy/spam") LOGNAME=`/usr/bin/whoami` for DIR in ${DIRS[@]} do cd $DIR sudo /usr/bin/svn update –accept=postpone 2>&1 | logger logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) " done 问题是,当我只提交其中一个项目的子文件夹时,这是很慢和冗余的。 我想知道是否有更好的方法来确定哪个DIRS我应该使用, 只更新那个。 有没有办法做到这一点? 据我所知,没有办法确定回购的哪个部分被提交,从而哪个目录需要更新。 是否为每个项目创build单独的存储库的唯一select? (如果是这样的话,可能应该从一开始就这么做)

查找并删除目录层次结构中的重复文件名

#!/bin/sh LASTBASE="" find $1 -type f -print | rev | sort | rev | while read FILE do BASE=$(basename "$FILE") if [ "$BASE" = "$LASTBASE" ]; then rm "$FILE" LASTBASE="$BASE" done

Linuxdate翻译到不同的时区

Linux服务器托pipe在EST时区。 但是我想将date命令的输出翻译成IST(印度标准时间+5:30小时)格式,并在shell脚本中使用它。 是否有任何选项可用于date命令来做到这一点,或手动加/减小时。

百胜报道更新的bash,但二进制仍然报告旧版本

我试图更新一个CentOS 5系统,以修补CVE-2014-6271 / RHSA-2014:1293-1中描述的bash漏洞,但遇到了一个问题。 通过yum update bash看起来成功更新bash并重新启动服务器后, yum list bash列出已安装的版本为已修补(3.2.33.e15.1),但/bin/bash –version正在显示3.2.25(1) -发布。 通过所有帐户(通过rpm -ql bash ),二进制位置是正确的, find / -name bash只返回一个位置。 任何想法,为什么版本差异可能会发生?

bc:用bashvariables使用“scale”

很容易,我正在编写一个脚本,需要浮点数后有2位数的值。 试图使用bc我不明白如何使用“规模”,即 A=12 ; bc <<< $(($A/5)) 这是正确的,但添加“规模”导致错误: A=12 ; bc <<< 'scale=2;$(($A/5))' (standard_in) 1: illegal character: $ (standard_in) 1: illegal character: $

在cronjob中加载用户环境variables

我如何加载用户环境variables在cronjob? 我有一个应该在Ubuntu机器上每分钟启动一个脚本的cronjob: * * * * * /home/user/myscript.sh; 在这个脚本中,我想使用像$JAVA_HOME和$M2_HOME这样的环境variables来自动启动一个构build过程。 问题是这些variables是通过export JAVA_HOME=/../..在.bashrc中设置的。 因此,在执行我的脚本之前,我会提供这些文件: * * * * * source ~/.bash_profile; source ~/.bashrc; /home/user/myscript.sh; 但是,variables没有设置! 为了testing这个,我通过env将环境variablesecho显到日志文件中: env >> ~/env.log echo $M2_HOME >> ~/env.log 日志文件仍然不包含variables。 只有以下内容被追加到文件(无$M2_HOME等): LANGUAGE=en_US:en HOME=/home/user LOGNAME=user PATH=/usr/bin:/bin LANG=en_US.UTF-8 SHELL=/bin/sh PWD=/home/user 如果我在shell中运行脚本,所有的variables都会打印到env.log 。 当我将source放入脚本文件时,情况也是如此。 只有在声明variables之前删除了export关键字,它才能被echo $var命令看到。 但这不是一个解决scheme,因为我不pipe理这些声明。 我尝试了@tripplee与有限的SH壳问题的解决scheme,但它仍然无法正常工作。 我进一步减less到一个非常简单的cronjob没有第二个脚本来显示问题: * * * * * . $HOME/.bash_profile; […]

shell脚本的美元括号内的减号是什么意思?

在现有的shell脚本中,我看到一些引用的variables,包括或以负号结尾。 例如: PID=${PID-/run/unicorn.pid} 和: run_by_init() { ([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ] } 在这两种情况下,减号是什么意思?