我以前使用CShell(csh),它允许你创建一个带参数的别名.符号是这样的
alias junk="mv \\!* ~/.Trash"
Run Code Online (Sandbox Code Playgroud)
在Bash中,这似乎不起作用.鉴于Bash有许多有用的功能,我会假设这个功能已经实现,但我想知道如何.
有人能告诉我是否应该在shell脚本中包含变量的引号?
例如,以下是正确的:
xdg-open $URL
[ $? -eq 2 ]
Run Code Online (Sandbox Code Playgroud)
要么
xdg-open "$URL"
[ "$?" -eq "2" ]
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么?
是否可以执行以下操作:
我想运行以下内容:
mongodb bin/mongod
Run Code Online (Sandbox Code Playgroud)
在我的bash_profile中我有
alias = "./path/to/mongodb/$1"
Run Code Online (Sandbox Code Playgroud) 有没有办法让编译的命令行程序告诉bash或csh它不希望扩展其参数中的任何通配符?
例如,可能需要一个shell命令,如:
foo *
Run Code Online (Sandbox Code Playgroud)
简单地返回该字符的数字ASCII值.
我偶尔会看到这种模式,尤其是在有关Bash提示自定义的问题上。
alias f='_ () { useful code; }; _'
Run Code Online (Sandbox Code Playgroud)
我完全没有理由在此处创建别名。明显的重构
f () { useful code; }
Run Code Online (Sandbox Code Playgroud)
这样就避免了完全声明一个别名,而只是简单地一劳永逸地定义了函数,这看起来更简单,更易理解,不那么脆弱且更高效。(以防万一,每次调用别名时,别名最终都会重新声明该函数。)
例如,使Bash别名带有参数?有几个答案可以证明这种技术。使用ftp路径运行lftp的bash脚本是一个有关此函数内部实际功能的问题,其中包含类似这样的代码,尽管我轻描淡写,OP也不解释为什么。
这是否仅仅是一种反模式,还是有实际的理由这样做?在什么情况下该设计有意义?
这与别名后面没有空格有关,也与代码混淆无关(除了这种神秘的技术之外,我发现的示例通常是完全可读的)。
我在本主题中看到,如果要使用参数,可以在shell登录脚本中添加函数而不是别名.但是,我将以下代码放在带有别名的部分的.cshrc文件中:
function gf()
{
grep -n $1 `find .` | grep -v "can't open"
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入source .cshrc时,我收到错误消息:Badly placed()的.C shell的语法与Bash shell的语法不同吗?如果是这样,那么正确的语法是什么?
我在.bashrc中添加了一个别名
alias sr ='sudo /etc/rc.d/[parameter?] restart'
sr network - > sudo /etc/rc.d/network restart
sr sshd - > sudo /etc/rc.d/sshd restart
可以实现,谢谢!
如果您的.bash_alias/.bashrc/etc只能包含一行,您会选择保留哪一个别名?
我试图说服我的同事离开svn并切换到git.我看到的一个问题是:它必须分别执行git commit和git push是复杂且容易出错的.所以我在想一个git ci别名,它提交更改并将其推送到服务器.我知道,怎么做,但是:
问题是,我想给git commit提供像-m""这样的参数.所以
git ci -m "Cool change"
Run Code Online (Sandbox Code Playgroud)
应该执行
git commit -m "Cool change" && git push
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
我正在尝试使用bash中的命令行参数构造路径.我在.bashrc中添加了以下行:
alias hi="echo '/path/to/$1'"
Run Code Online (Sandbox Code Playgroud)
但是,这会产生:
~$ hi foo
/path/to/ foo
Run Code Online (Sandbox Code Playgroud)
想知道斜线后面的空白是从哪里出来的?
谢谢
汉纳斯
作为一个天真的菜鸟,我创建了几个用于接受参数的bash别名,它们完全按照预期工作.然而,我试图制作更多这样的别名,但这些不会按预期工作.
这个问题导致我在这里,我了解到bash别名不接受参数.相反,您必须创建一个函数.例如,请看这里或这里.
因此,假设"bash别名不接受论证"共识是正确的,为什么所有这些都有效?
alias pacss='pacman -Ss '
alias pacs='sudo pacman -S '
alias yausnc='yaourt -S --noconfirm '
Run Code Online (Sandbox Code Playgroud)
当我说这些"工作"时,我的意思是,例如,输入'pacs package'会提示我输入密码,提示确认,然后检索和安装包.
那么,为什么这些别名有效呢?他们接受的术语在技术上不是"论据"吗?这是Arch(或Manjaro,我正在使用)的特质吗?时空连续体中的一个洞?
任何澄清应予以赞赏.
编辑:谢谢你的答案解释这些不是要求争论.我不太明白我的第一个例子与以下尝试的别名有何不同,后者不起作用:
alias lping='ping 192.168.1.'
Run Code Online (Sandbox Code Playgroud)
这会失败,因为ping执行时没有附加数字I类型.我的意图是能够输入例如lping 123并让bash执行"ping 192.168.1.123",而是说"未知主机192.168.1".
当我工作时,我经常这样做:
cd ~/dev/lab/prod/
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,但我希望能够运行:
prod
Run Code Online (Sandbox Code Playgroud)
具有相同的效果(更改为 ~/dev/lab/prod 文件夹)。