我正在尝试使用if-then-else条件的别名 在命令结果上。
我尝试过的别名是:
alias atest 'if \("ls \!:1" > 0 \) "nedit ls \!:1" else "echo cant open the file" '
答案 0 :(得分:2)
您无法使用别名执行此操作。别名只能扩展为单行命令,但if
需要多行。
相反,使用shell脚本。脚本不必使用交互式使用的相同语言,因此您可以使用POSIX shell,这通常被认为比C shell更适合编程(参见Csh Programming Considered Harmful)。
#!/bin/sh
if [ $# -eq 1 ]
then nedit "$1"
else
echo "Can't open the file"
exit 1
fi
将此信息放入名为atest
的文件中,为其授予执行权限,并将其放在$PATH
中的目录中。
答案 1 :(得分:0)
有几种方法,其中大多数都不是很优雅,但以下是我发现的最好看和最容易创作:
alias aliasname '`if (condition == check) echo "echo"` >&/dev/null && code_if_true || code_if_false'
您可以使用此格式嵌套if语句,如果将if语句的内部更改为
,也可以将其用作参数的检查器if ("\!:1" =~ "check")
>& / dev / null用于清理函数的输出,但不是必需的。如果您感兴趣,还有一种方法可以在别名中生成语句,但是这种方法不那么优雅。我还没有使用它,但如果你想创建一个包含不同数量参数的别名,这是必要的。再一次,那个是丑陋的,所以在那一点上我只是写一个函数。
答案 2 :(得分:0)
基于Jonathan Roberts解决方案。这是本地服务器上bash脚本的一部分。检查用户XXXXX是否为真,通过ssh发送BASH命令。否则发送TCSH命令。该命令检查目录是否存在,返回true或false
if [[ ${LOCAL_USER} == "XXXXX" ]]; then
LOCAL_DIR_EXIST_CHECK=$(ssh -v -q -i ~/.ssh/"${LOCAL_SSH_KEY_FILE}" "${LOCAL_USER}@${LOCAL_SERVER}" "if [[ -d ${LOCAL_CLIENT_DIRECTORY} ]];then echo 'TRUE'; else echo 'FALSE'; fi")
else
LOCAL_DIR_EXIST_CHECK=$(ssh -v -q -i ~/.ssh/"${LOCAL_SSH_KEY_FILE}" "${LOCAL_USER}@${LOCAL_SERVER}" '`if ( -d ' ${LOCAL_CLIENT_DIRECTORY} ') echo "echo"` > & /dev/null && echo TRUE || echo FALSE')
fi
答案 3 :(得分:0)
实际上,tcsh的别名可以包含多行。只需在每行后面加反斜杠(),然后继续在下一行写别名。
~> alias atest 'set __atest_pattern="\!:1" \
? set __atest_files=( "`ls -d $__atest_pattern`" ) \
? if ( $#__atest_files == 1 ) then \
? nedit "$__atest_files[1]" \
? else if ( $#__atest_files > 1 ) then \
? echo "Too many files ($#__atest_files) are matched to '\''$__atest_pattern'\''" \
? endif'
~> alias atest
set __atest_pattern="!:1"
set __atest_files=( "`ls -d $__atest_pattern`" )
if ( $#__atest_files == 1 ) then
nedit "$__atest_files[1]"
else if ( $#__atest_files > 1 ) then
echo "Too many files ($#__atest_files) are matched to '$__atest_pattern'"
endif
~> atest *
Too many files (73) are matched to '*'
~> atest dummy
ls: cannot access dummy: No such file or directory
~> atest /dummy/*
ls: No match.
~> atest .cshrc
# Actually nedit was invoked here
~>
答案 4 :(得分:0)
使用@JonathanRoberts 的回答,我终于能够改进我在 exit
内的 shell 中使用的 screen
的别名,这样我就不会在我真的时不小心退出想要分离。所以,现在我可以用 exit now
覆盖伪造的退出,如果我想真正退出:
在~/.tcshrc
if ($?TERM && $TERM =~ screen.*) then
#OLD ALIAS# alias exit "echo 'exit disabled (via alias)'; screen -d"
alias exit '`if ("\!:$" == "now") echo "echo"` >&/dev/null && exec false || echo "really? use: exit now" ; screen -d'
endif