如何在文件执行期间不运行它的情况下将别名写入文件?

问题描述 投票:0回答:2

我正在尝试编写一个创建别名并将其写入文件的函数。我这样写是为了让用户输入 $1 的别名名称和 $2 的别名旅行路径。 我有 2 个变量

$alias_name
$path_to_add
分别存储 $1 $2。然后我有第三个变量
$jp_string
看起来像这样:

`jp_string="别名 $alias_name='cd $path_to_add'"

该函数检查两个参数是否存在,如果存在,则使用它们填充 $jp_string 的空格,然后将 $jp_string 写入文件。一切正常,除了当我运行脚本时,我的字符串中的“别名”一词作为命令运行,而不是仅仅被视为一个字符串。如何编写 $jp_string 变量,以便将其解析为双引号中的字符串而不是命令?感谢任何帮助我在别处寻找答案并不断接近但不完全是。我了解到您需要将像 '$' 这样的特殊符号转义为 $ 才能在字符串中使用它,但是您如何在字符串中“转义”诸如 'alias' 或 'cd' 之类的命令?

所以在这个函数中,如果我传入例如“myalias”和“my/new/path”作为参数 $1 和 $2。这是我得到的输出错误:

addPathToJumpPoints:11: 别名 myalias='cd' not found

function addPathToJumpPoints() {
    
    alias_name=$1
    path_to_add=$2
    xjp_file=$XFILES/.xtest
    jp_string=""

    if [[ ! -z $alias_name ]]; then
    
        if [[ ! -z $path_to_add ]]; then
            $jp_string="alias $alias_name='cd $jp_path'"
            
            if [[ -d $path_to_add ]]; then                      
                echo $jp_string >> $xjp_file
        echo "Jump point to: [$path_to_add] was created!"
            else
        echo "[$path_to_add] does not exist, would you like to create it? (y/n)"
            read make_path
                
                if [[ $make_path == "y" ]]; then
            mkdir $path_to_add
                    echo $jp_string >> $xjp_file
                    echo "$path_to_add and a jump point to it were created!"
                elif [[ $make_path == "n" ]]; then
                    echo "Should a jump point be made regardless? (y/n)"
                    read make_jp
            
                    if [[ $make_jp == "y" ]]; then
                        echo $jp_string >> $xjp_file
                        echo "Jump point to [$path_to_add] was created!"
                    elif [[ $make_jp == "n" ]]; then
                        echo "No jump point was created."
                    else
                    echo "Invalid answer!. Enter only 'y' for yes and 'n' for no."
                    fi
                
                else
                echo "Invalid answer. Enter only 'y' for yes and 'n' for no."
        fi
            fi
        else
            echo "Please provide a path to create a jump point"
        fi
    else
        echo "Please provide an alias and a path to create a jump point!"
    fi
}


bash shell syntax
2个回答
0
投票

这条线

$jp_string="alias $alias_name='cd $jp_path'"
  1. 要声明一个字符串,就像 STRING_NAME="some string"
  2. 我没有在任何地方看到 jp_path 定义。不应该是输入 $2,即 path_to_add 吗?

尝试将行更新为以下内容:

jp_string="alias $alias_name='cd $path_to_add'"

0
投票

从字里行间,我想我能猜到你想要完成什么。

您正在创建一个变量(或者更确切地说,试图),而不是函数或别名。你不能声明接受参数的别名(这是一个常见的初学者常见问题解答)但看起来你正在寻找像

这样的函数
add_jp () {
    alias $1="cd '$2'"
    echo "alias $1=\"cd '$2'\""
}

echo
可能很有用,因此您可以将输出重定向到文件。 (否则我建议不要这样做。脚本的其余部分应将其诊断消息输出到标准错误;

echo "informational message" >&2

并且可能还包括脚本的名称。一个常见的安排是创建一个简单的函数来执行此操作;

warn () {
    echo "${0##*/}: $*" >&2
}
:
    warn "informational message"

参数扩展

$0
中删除最后一个斜线之前的所有内容,因此打印没有路径的当前脚本名称。包括发出消息的实用程序的名称可以帮助您了解当您有脚本调用脚本时发生了什么,其中一个脚本告诉您一些有用的信息。)

您也可以将别名声明放在字符串中,然后是

eval "$jq_string"
,但您通常希望避免使用
eval
,尤其是当您
eval
包含未经审查的用户输入时。这是一个重要的安全考虑,严重到最简单的规则实际上只是“避免
eval
,即使你认为你知道自己在做什么。”

© www.soinside.com 2019 - 2024. All rights reserved.