我正在使用 Mac OSX。当我打字时,ls -l
我看到类似的东西
drwxr-xr-x@ 12 xonic staff 408 22 Jun 19:00 .
drwxr-xr-x 9 xonic staff 306 22 Jun 19:42 ..
-rwxrwxrwx@ 1 xonic staff 6148 25 Mai 23:04 .DS_Store
-rw-r--r--@ 1 xonic staff 17284 22 Jun 00:20 filmStrip.cpp
-rw-r--r--@ 1 xonic staff 3843 21 Jun 21:20 filmStrip.h
Run Code Online (Sandbox Code Playgroud)
@的意思是什么?
mv foo* ~/bar/
如果没有匹配的文件,则类似命令会在 stderr 中生成此消息foo*
。
mv: cannot stat `foo*': No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,在我正在处理的脚本中,这种情况完全没有问题,我想从我们的日志中省略该消息。
有没有什么好的方法可以让你mv
保持安静,即使什么都没有移动?
在 bash 脚本中,我分配了一个局部变量,以便该值取决于外部的全局环境变量 ( $MYAPP_ENV
)。
if [ "$MYAPP_ENV" == "PROD" ]
then
SERVER_LOGIN=foobar123@prod.example.com
else
SERVER_LOGIN=foobar987@test.example.com
fi
Run Code Online (Sandbox Code Playgroud)
是否有更短(但干净)的方式来编写上述作业?(大概使用某种条件运算符/内联 if。)
愚蠢的是,我一直在使用这样的条件作为脚本的一部分:
if [ $(ls FOO* 2> /dev/null) ] # if files named "FOO*" were downloaded
then
echo "Files found"
# ... process and email results
else
echo "Not found"
# ... email warning that no files were found (against expectations)
fi
Run Code Online (Sandbox Code Playgroud)
这适用于零个和一个名为 的文件FOO*
,但如果有多个则失败。从日志中,我发现了几个不同的错误消息:
[: FOO_20131107_082920: unary operator expected
[: FOO_20131108_070203: binary operator expected
[: too many arguments
Run Code Online (Sandbox Code Playgroud)
我的问题是:在 Bashif
条件下,检查名称以 开头的一个或多个文件是否FOO
存在的正确方法是什么?
GNU bash,版本 4.2.25(1)-release (x86_64-pc-linux-gnu)
在命令行上使用 Subversion,它可以智能地完成可用的子命令等:
$ svn c<tab>
cat checkout cl co copy
changelist ci cleanup commit cp
Run Code Online (Sandbox Code Playgroud)
另一方面,Mercurial 似乎没有制表符完成功能,至少开箱即用:
$ hg c<tab>
[nothing happens]
Run Code Online (Sandbox Code Playgroud)
Mercurial 的 Bash 补全是否可用?让它工作的最简单方法是什么?我在 Ubuntu 11.04 上。
bash ×4
ls ×2
assignment ×1
autocomplete ×1
files ×1
mercurial ×1
mv ×1
osx ×1
permissions ×1
shell-script ×1
wildcards ×1