【问题标题】:How to use the Bash read command to capture filepaths containing "~" (tilde)如何使用 Bash 读取命令来捕获包含“~”(波浪号)的文件路径
【发布时间】:2016-11-04 11:13:54
【问题描述】:

所以我一直在开始编写 bash 脚本,并且我正在制作一个将从源代码自动安装的脚本(因此它基本上只是为您编译 tarball)。我需要它来更改目录才能进入压缩包。但是,每当我使用此命令时

read path
cd $path

我总是收到错误tar-installer.sh: line 13: cd: ~: No such file or directory 对于任何需要它的人,这是完整的脚本...

#!/bin/bash
# This program auto-installs tarballs for you.
# I designed this for Linux noobies who don't
# know how to install tarballs. Or, it's for
# people like me who are just lazy, and don't
# want to put in the commands ourselves.

echo "Tar Installer v1.1"
echo "Gnu GPL v2.1"
echo -n "Path to tarball:"
read path
cd $path
echo -n "Please enter the file you wish to complile..."
read file
if  $file =="*.tar.gz"
then
    tar -xzf $file
   else
       $file =="*.tgz"
then
    tar -xzf $file
else
    $file =="*.tar.bz2"
then
    tar -xjf $file

包含 tarball 的最后一部分仍在进行中。但是我用于cd path 的目录是~/Downloads/

这可能是一个简单的修复,但我不知道如何修复它。

【问题讨论】:

  • 在接受带有“~/”的文件路径时,问题似乎与读取内置函数有关。
  • 请使用shellcheck.net 并在发布代码之前更正在那里发现的任何错误(您现在应该这样做)。谢谢,祝你好运..

标签: bash tilde


【解决方案1】:

您需要将波浪号 ~ 替换为主路径。如果不直接执行,则此扩展失败。

 cd "${path/#~/$HOME}"

将使用 bash 的替换 ${value/search_term/replacement}~ 替换为您的主目录。

你可能还想结合 echo & read:

read -p "Path to tarball: " pathname

命名变量如路径时也要小心(PATH 是你的环境变量)

【讨论】:

  • PATH ~other_user 怎么样?
  • 如果您的目录布局是常规 Linux 标准,添加第二个替换以将任何剩余的前导 ~ 替换为 /home/ 似乎是一种显而易见的方法。
【解决方案2】:

因为“cd”是 bash 的内置函数。 所以你应该尝试像这样运行你的脚本:

 #source tar-installer.sh

这里有类似的问题:

[1]: https://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script

【讨论】:

  • 不,这不是报告的问题。
  • 为什么?我不明白。我尝试在 Ubuntu 14:04 中准确运行脚本 tar-installer.sh 第一次出现“cd”错误,但随后“source”没有错误。所以我认为#source tar-installer.sh 会解决这个问题。
  • 这里的问题在于波浪号扩展。如果~ 已经是变量的一部分,它将不会被扩展。您提供的问题链接解决了一个完全不同的问题。当您执行 一个脚本而不是sourceing 时,会生成一个子shell。 cd 更改该 shell 中的工作目录;父级中的工作目录保持不变。此行为与此处提出的问题无关。
  • 另外,你不应该source 一些你不知道的东西。 source 可以改变当前 shell 的环境。你应该非常小心。如果您是脚本的作者并且已采取适当的预防措施以免破坏现有环境并产生意外的副作用,那么只有您才应该获取它。
  • 感谢您的指正。我明白了。我还是新来的,我会在发布回复之前更加小心(:
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2017-12-12
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多