使用if-then-else条件的tcsh别名

时间:2017-07-04 07:07:55

标签: linux alias tcsh

我正在尝试使用if-then-else条件的别名 在命令结果上。

  1. 别名将获得文件模式
  2. 如果只有一个文件,则会打开文件
  3. 如果有多于或少于1个文件 - 它将显示一条消息。
  4. 我尝试过的别名是:

    alias atest 'if \("ls \!:1" > 0 \)  "nedit ls \!:1" else "echo cant open the file" '
    

5 个答案:

答案 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