循环未持久化时在中设置的bash别名

循环未持久化时在中设置的bash别名,bash,sh,alias,Bash,Sh,Alias,好的,我编写了一个shell脚本来读取以下格式的文件: shortcut1/path/to/directory1 shortcut2/path/to/directory2 它应该读取文件并构建别名,以便在映射目录中键入shortcut1cd's me。问题是,循环中设置的任何别名都不会在脚本之外持久存在 首先,我试着运行脚本 /生成_shortcuts.sh“~/.shortcuts” 其中~/.shortcuts文件包含 dl~/Downloads 音乐/音乐 dtop~/桌面 这不管用。然后

好的,我编写了一个shell脚本来读取以下格式的文件:

shortcut1/path/to/directory1
shortcut2/path/to/directory2

它应该读取文件并构建别名,以便在映射目录中键入shortcut1cd's me。问题是,循环中设置的任何别名都不会在脚本之外持久存在

首先,我试着运行脚本

/生成_shortcuts.sh“~/.shortcuts”

其中~/.shortcuts文件包含

dl~/Downloads
音乐/音乐
dtop~/桌面

这不管用。然后我尝试在循环之外设置一些别名。例如别名hello='world';别名world='hellob'。我重新运行脚本,键入alias以获得别名列表,它确实包含hello和world作为别名,但不包括循环中设置的任何别名

然后我想可能循环根本没有设置它们,所以我在脚本中添加了alias作为最后一个命令,以便它在最后打印出别名;在本例中,它确实包含别名,但它们仍然没有保留在我的会话中

build_.sh

script=“$(cat$@|sed-r-e's/#[A-Za-z0-9]*$/'-e'/^\s+/^\s+/'-e'/^\s*$/d'-)”
#从filestream中剥离注释、入门级缩进和空行(按该顺序)
读取快捷方式时回显“${script}”;做
剪切=$(回显“${shortcut}”| awk'{print$1}')
dest=$(回显“${shortcut}”| awk'{$1=nil;打印$0}')
dest=“${dest:1}”#修剪前导空格字符
别名“${cut}”和>/dev/null
如果[$?=0];然后
echo“警告:快捷方式\“${cut}\”已存在”>&2
继续#默认情况下,跳过覆盖快捷方式
fi
回显别名${cut}=“'cd${dest}'”
别名“${cut}”=“cd${dest}”
完成
我希望脚本中循环中设置的别名存在于脚本之外。目前他们没有

我正在arch linux上运行“GNU bash,版本5.0.7(1)-发行版(x86_64-pc-linux-GNU)”。

来自(管道部分):

管道中的每个命令都作为单独的进程执行(即,在子shell中)

由于循环是作为管道的一部分完成的,因此它将是一个子shell,并且您在子shell中执行的alias命令将仅为该子shell设置

一种可能的解决方法是将别名保存到列表中,然后在第二个循环中执行实际的
alias
命令,该循环不是管道或子外壳的一部分。

来自(管道部分):

管道中的每个命令都作为单独的进程执行(即,在子shell中)

由于循环是作为管道的一部分完成的,因此它将是一个子shell,并且您在子shell中执行的alias命令将仅为该子shell设置


一种可能的解决方法是将别名保存到列表中,然后在第二个循环中执行实际的
alias
命令,该循环不是管道或子shell的一部分。

您的脚本可以减少一点:它不需要调用太多外部工具

while read -r cut dest; do
    if alias "${cut}" &>/dev/null; then
        echo "Warning: shortcut \"${cut}\" already exists" >&2
    else        
        echo alias ${cut}="'cd ${dest}'"
        alias "${cut}"="'cd ${dest}'"
    fi
done < <(
    sed -E -e 's/#[A-Za-z0-9 ]*$//' -e '/^\s+/s/^\s+//' -e '/^\s*$/d' "$@"
)
读取时-r剪切dest;做
如果别名“${cut}”和>/dev/null;然后
echo“警告:快捷方式\“${cut}\”已存在”>&2
其他的
回显别名${cut}=“'cd${dest}'”
别名“${cut}”=“cd${dest}”
fi

完成<您的脚本可以减少一点:它不需要调用这么多外部工具

while read -r cut dest; do
    if alias "${cut}" &>/dev/null; then
        echo "Warning: shortcut \"${cut}\" already exists" >&2
    else        
        echo alias ${cut}="'cd ${dest}'"
        alias "${cut}"="'cd ${dest}'"
    fi
done < <(
    sed -E -e 's/#[A-Za-z0-9 ]*$//' -e '/^\s+/s/^\s+//' -e '/^\s*$/d' "$@"
)
读取时-r剪切dest;做
如果别名“${cut}”和>/dev/null;然后
echo“警告:快捷方式\“${cut}\”已存在”>&2
其他的
回显别名${cut}=“'cd${dest}'”
别名“${cut}”=“cd${dest}”
fi

完成<注意
~
如果在引号内,则不会展开。注意
~
如果在引号内,则不会展开。