问题描述

我正在尝试提取Nvidia cuda库安装程序的不同部分。我正在使用以下命令:

mkdir ~/Downloads/nvidia_installers

./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

我收到以下消息:

ERROR: extract: path must be absolute.

当我用我家的文字地址键入命令时,它完美地工作。

./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers

我很困惑不应该〜/home /likewise-open /XXX /用户名相同?

测试:

./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers

它工作,但我不知道为什么它不允许~

最佳解决办法

Bash只会扩展一个〜,如果它是一个单词的开头。您可以在以下命令之间看到此信息:

$ echo -extract=~/test

-extract=~/test

oli@bert:~$ echo -extract ~/test

-extract /home/oli/test

Bash查找独立的~字符和~/进行此替换。没有其他组合或引用版本可行。

$HOME起作用,因为变量替换更加稳健($是一个特殊字符,而~则非常少):

$ echo Thisisastring${HOME}awrawr

Thisisastring/home/oliawrawr

当我们谈论~时,它实际上还有另外两种替代用途:

~+当前工作目录(从$PWD读取)

~-上一个工作目录(从$OLDPWD读取)

与普通的~一样,这些可以在最后添加额外的路径,同样,这些必须是单词的前缀,否则Bash会忽略它们。

您可以在man bash | less -p ' Tilde'中相关信息

次佳解决办法

只是解决它

此命令显示错误消息“错误:提取:路径必须是绝对的”:

./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

该错误没有帮助 – 该程序已经太混乱了。您已经知道错误来自~,因为它与$HOME一起使用。

问题:~只在单词的开头被替换。

例如,这适用于波浪号:

echo -extract ~/Downloads

如果您需要使用=的选项语法,使用$ HOME而不是~是最干净的解决方案;

echo -extract=$HOME/Downloads

实践

你应该知道的:

有些特殊情况下,~在不在单词开头时进行扩展:作为变量赋值的一部分,直接在=之后。当然,这在这里令人困惑。

另一个重要的特例是它用于像PATH这样的变量。在变量分配中,~也在:之后扩展,就像在第一个=之后一样。

$ dir=~ sh -c 'echo D2: $dir'

D2: /home/user

$ sh -c 'echo D2: $dir' dir=~

D2:

$ echo Dir: $dir

Dir:

$ dir=~; sh -c 'echo D2: $dir'

D2:

$ echo Dir: $dir

Dir: /home/user

$ sh -c 'echo D2: $dir'; d3=~

D2:

$ echo d3: $d3

d3: /home/user

代字号的含义

在一个shell中,代字号~实际上并不是一个路径。它有时仅被路径$HOME取代。

它类似于shell提供的简写或缩写。它不能像一般的路径一样使用,shell “expands”它只能在非常特殊的地方路径。即使它被扩展,它也可能是主目录以外的东西。

它仅在单词的开头或:或=之后的变量赋值中展开

如果它不在引号内,它只会被扩展

如果在/之前的单词中没有其他字符,则它仅扩展为$HOME

命令行中的问题

根据这个,你的命令中的问题是波形符号

-extract=~/Downloads/nvidia_installers

没有扩展,因为它不是列出的案例之一。就这样。

解决方案可能是使代字号成为单词的第一个不带引号的字符,在下一个/之前没有其他字符 – 这就是在选项参数之前使用带空格的选项时得到的结果:

-extract ~/Downloads/nvidia_installers

另一种解决方案是使用$HOME代替。在脚本中,这通常是更好的选择。

-extract=$HOME/Downloads/nvidia_installers

错误消息

但是"ERROR: extract: path must be absolute."的错误信息怎么样?适合这一切?

我们知道波浪号没有扩大。这意味着程序得到的参数文本包括~,但没有/home/auser作为路径。该路径是~/Downloads/nvidia_installers – 但现在没有shell,因此代字号没有特殊含义。它只是一个普通的目录名称。并且作为foo/bar/baz形式的每个其他路径,它是相对路径

其他用途

如果在~之后有字符,如~alice中所示 – 上面的所有其他规则都适用 – 并且有一个用户名alice,而是扩展到alice的主目录,比如说home/alice。此外,如果您是bob,~将扩展为/home/bob,并且~bob将扩展为相同。

变体~+扩展到当前目录$PWD

要引用上一个cd之前的目录,可以使用~-,它扩展为$OLDPWD。

如果您使用pushd和popd而不是cd,您将知道可以像~-2一样访问目录堆栈。

Details

所有将~扩展到路径的情况都由shell进行管理。对于其他程序,~只是一个普通的文件名字符。

对于shell中的确切定义,这里是man bash的相关部分。注意如何用$HOME替换~只是许多情况下的一个特例:“如果此登录名是空字符串,则将波形符替换为shell的值参数HOME。“:

Tilde Expansion

If a word begins with an unquoted tilde character (`~'), all of the charac‐

ters preceding the first unquoted slash (or all characters, if there is no

unquoted slash) are considered a tilde-prefix. If none of the characters

in the tilde-prefix are quoted, the characters in the tilde-prefix follow‐

ing the tilde are treated as a possible login name. If this login name is

the null string, the tilde is replaced with the value of the shell parame‐

ter HOME. If HOME is unset, the home directory of the user executing the

shell is substituted instead. Otherwise, the tilde-prefix is replaced with

the home directory associated with the specified login name.

If the tilde-prefix is a `~+', the value of the shell variable PWD replaces

the tilde-prefix. If the tilde-prefix is a `~-', the value of the shell

variable OLDPWD, if it is set, is substituted. If the characters following

the tilde in the tilde-prefix consist of a number N, optionally prefixed by

a `+' or a `-', the tilde-prefix is replaced with the corresponding element

from the directory stack, as it would be displayed by the dirs builtin

invoked with the tilde-prefix as an argument. If the characters following

the tilde in the tilde-prefix consist of a number without a leading `+' or

`-', `+' is assumed.

If the login name is invalid, or the tilde expansion fails, the word is

unchanged.

Each variable assignment is checked for unquoted tilde-prefixes immediately

following a : or the first =. In these cases, tilde expansion is also per‐

formed. Consequently, one may use filenames with tildes in assignments to

PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.

第三种解决办法

~本身不是路径。这是一个从shell获得特殊处理的角色,其中~或~/表示“替换为当前用户的主目录路径”。 ~username表示“替换为用户名的主目录路径”。

因为它不是路径,所以它只在命令的某些位置被识别(作为新space-split令牌的第一个字符)。

展开时,它用绝对路径替换。

使用$HOME是有效的,因为HOME只是由shell设置的变量,并遵循用于变量替换的常规shell规则(它在输入被分割为空格并执行之前发生)。

参考资料

linux波浪号是哪个目录,是波浪号,`~`被认为是相对路径?相关推荐

  1. 在Linux(unix)中,以波浪线“~”开始的文件名

     在Linux(unix)中,以波浪线"~"开始的文件名有特殊含义. 单独使用它或者其后跟一个斜线(~/),代表了当前用户的宿主目录.(在shell下可以通过命令"e ...

  2. Python学习笔记.OS学习笔记 OS操作系统(operating system)(二)程序和进程 输出进程号,工作目录最有用!

    程序和进程: 运行一个程序的时候,操作系统会创建一个进程.他会使用系统资源和操作系统内核的数据结构! 进程间相互隔离,即一个进程无法访问其他进程内容,也无法操作其他进程! Mac上面可以使用活动监视器 ...

  3. linux 没有那个文件或目录_基于CentOS8Linux运维教程-Linux文件目录管理笔记

    Linux文件目录结构及用途 文件目录增删改查 vim编辑器使用技巧 准备工作: 虚拟机 root登录系统 打开终端 操作技巧 方向键 上下键可以查看历史的命令 tab键 自动补齐命令及参数 取消命令 ...

  4. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备

    一.引言 很久前接触linux驱动就知道主设备号找驱动,次设备号找设备.这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理: 二.Linux内核主次设备号的管理 Li ...

  5. Linux之文档与目录结构

    Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有"盘(C盘.D盘.E盘)"的概念.已经建立文件系统的硬盘分区被挂载到某一个目录下 ...

  6. 【linux回炉 档案权限与目录配置】

    Linux 的档案权限不目录配置 Linux 最优秀的地方之一,就在于他的多人多任务环境.而为了让各个使用者具有较保密的档案数据,因此档案的权限 管理就变的重重要了. Linux 一般将档案可存取的身 ...

  7. 【Linux系统编程】进程概述和进程号

    00. 目录 文章目录 00. 目录 01. 进程概述 02. 进程状态 03. 进程控制块 04. 进程号 05. 进程号相关函数 06. 案例实战 07. 附录 01. 进程概述 我们平时写的 C ...

  8. linux目录表及功能n鸟哥,鸟哥linux学习之-资料与目录管理

    鸟哥linux学习之--文件与目录管理 目录与路径 相对路径:由当前目录算起 绝对路径:由根目录算起,linux的根目录为"/" 几个目录符号: . 表示当前目录 .. 表示上一层 ...

  9. linux ftp查看用户目录权限,linux 指定ftp用户 特定目录及权限

    Linux添加FTP用户并设置权限 在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户: ...

最新文章

  1. keras神经网络回归预测_如何使用Keras建立您的第一个神经网络来预测房价
  2. 博士生宿舍条件太好,本科生因疫情暂住惊到结巴!网友:不然咱读个博?
  3. python获取精彩视频_python获取莫视频网站视频
  4. 如何扩展CentOS7的SWAP分区
  5. 201671030128+词频统计软件项目报告
  6. 如果你也在学python,准备要学习python,希望这篇文章对你有用。
  7. 管理软件开发历程之一Coolite配置
  8. 计算机视觉中,目前有哪些经典的目标跟踪算法?
  9. 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制
  10. Atitit cs计算机科学概论 艾提拉解读版 2. 第二部分 信息层 4 5. 第三部分 硬件层 5 8. 第四部分 程序设计层 7 13. 第五部分 操作系统层 10 16. 第六部分 应
  11. 3Dmax2010 的 安装与激活
  12. Gallery3d 学习笔记(12)
  13. TIM软件 docx.文件 安卓手机下载路径
  14. 虚拟机如何使用计算机中文件,如何从电脑往虚拟机复制文件
  15. jqwidgets splitter把页面水平分割
  16. 第5周编程题在线测试
  17. 东方通 -- 如何安装、启动、停止、卸载东方通中间件
  18. code online-线上码-随时随地在线写代码,支持主流语言 go lua luajit php perl python ruby woo dotnet
  19. prism 创建ViewModel
  20. 群论基础速成(5):生成元,凯莱图,轨道,循环图,以及群的“维度”?

热门文章

  1. 三维数字化开发管理中心
  2. 百度PaddlePaddle框架简易使用教程
  3. caoz谈能力成长系列 - 提问的技术
  4. 纯 CSS 实现鼠标跟随效果
  5. 本文是对优雅草蜻蜓C影视便捷追剧小程序微信支付配置教程-大部分小程序支付通用,从微信配置到后台的详解,其他小程序系统均可参考
  6. 曝刘德华朱丽倩隐居豪宅 独门独户显气派
  7. python 发邮件 无需密码_Django实现发送邮件找回密码功能
  8. 计算机学科专业基础综合811,2012年同济大学硕士研究生专业目录及初复试科目-914...
  9. AX=XB李群李代数知识求解方程
  10. 视觉SLAM —— 李群与李代数