标签: bash

如何配置 bash 以始终解析符号链接的完整路径

主持人:这不是重复!!!!请删除重复标记。

链接到的答案实际上并没有像公认的答案那样回答我的问题。谷歌只指出其他答案,这些答案实际上并不是这个特定问题的答案。

当跟随一个指向目录的符号链接时,bashshell 会试图制造符号链接是一个真实目录的错觉。但是,在很多情况下,这会崩溃。例如,考虑我可能有:

/usr/local/src/project-a-1.0/
/usr/local/src/project-b-2.2/
Run Code Online (Sandbox Code Playgroud)

然后,我的主目录中有一个符号链接:

ln -s /usr/local/src/project-a-1.0 ~/project
Run Code Online (Sandbox Code Playgroud)

现在,我想捷径与project-a

cd ~/project
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好——但是 bash 假装我实际上在~/project,而不是在实际的工作目录中。它甚至在使用pwd内置时假装,但在使用/bin/pwd可执行文件时当然不是。

现在,如果我想在 中检出一个文件project-b,我可能想vim ../project-b<TAB>尝试使命令完成工作。但是,bash拒绝完成此操作,因为它认为这..是包含用户家的目录。

但是,如果我输入,vim ../project-b-2.2/somefile.txt那么效果很好,这正是我所期望的。

符号链接不是目录,由于 bash 中的这个错误功能,会发生各种不便甚至错误。我试图寻找一个选项来关闭它,但所有的谷歌和超级用户点击都只是关于“如何手动解析链接路径”——这不是我想要的;我希望 bash 停止尝试在我的文件系统之上模拟文件系统,这很糟糕。当然,是否存在某些选项可以将正确性置于幻觉之前?

“类似问题”弹出窗口指出了谷歌已经发送给我的另外两个问题;他们两个要求我的“-P”选项传递给pwd或者cd甚至建议使用readlink找出符号链接的目标。这根本不是我感兴趣的。我希望内置pwd和 shell 提示$PWD匹配getcwd()系统调用的物理输出;那些问题根本不谈这个。

bash symbolic-link

6
推荐指数
1
解决办法
3270
查看次数

为什么不建议将 root 用户的默认 shell 设置为非 POSIX shell?

我要将我的 root 的默认 shell 从 bash 更改为 fish。据我所知,fish 不是 POSIX 标准外壳。另一方面,可能系统中的内核或其他东西与 POSIX 标准有关系,因此不建议将 root 的默认 shell 设置为非 POSIX 的 shell,因为这可能会导致操作系统的某些部分出现问题。我看到有人在某些主题上建议其他人不要将 root 用户的默认 shell 设置为非 POSIX 的 shell!这样对吗?

我是否应该将 root 的默认 shell 更改为非 POSIX 的 shell?(如果你能解释清楚,我会很高兴,我是类 Unix 世界的新手!)

linux bash shell posix fish

6
推荐指数
1
解决办法
869
查看次数

bash 中错误消息的结构

Bash 错误消息有时带有-bash:bash:前缀,有时没有。

考虑来自 Ubuntu 14.04.5 Trusty Tahr with bash 4.3.11(1) 的这些错误消息

$ type encabulator
-bash: type: encabulator: not found

$ encabulator
encabulator: command not found

$ bash -c encabulator
bash: encabulator: command not found
Run Code Online (Sandbox Code Playgroud)

另一个问题中,有人报告说看到了一条消息

-bash: fetch: command not found.
Run Code Online (Sandbox Code Playgroud)

当“fetch”只是一个尚未安装的程序时,这与预期的模式不匹配。


在下面的评论之后,我尝试在 Centos 5.7 上使用 bash 3.2.25(1) - 它的行为略有不同

$ type encabulator
-bash: type: encabulator: not found

$ encabulator
-bash: encabulator: command not found

$ bash -c encabulator
bash: encabulator: command not found
Run Code Online (Sandbox Code Playgroud)

所以我想来自另一个问题的消息正是我最初的想法,在我对 …

linux bash

6
推荐指数
2
解决办法
414
查看次数

“&gt;&gt; 文件命令”有什么作用,它与“命令&gt;&gt;文件”有什么不同?

从这个拿起高度投票评论什么``>>意味着终端命令?

“程序之前”是什么意思?显然是命令,但重定向也可以写在前面,即>> file command

我不记得见过这样的案例——尽管考虑到赞成票的数量,它们显然存在。我只见过并使用过格式的重定向命令

command >> file
Run Code Online (Sandbox Code Playgroud)

当使用>>及其同类(即2>2>&1等)。

你什么时候以及为什么要颠倒顺序?这是否意味着所有内容都stdout被重定向,而不仅仅是来自command?有谁有具体的例子吗?

我有一个谷歌,可以找到任何直接的例子。

bash redirection ordering command-line

6
推荐指数
1
解决办法
523
查看次数

使用 bash 运行脚本并提供终止时间

是否可以从 bash(例如 python)运行具有终止时间的脚本,这意味着如果该脚本运行时间超过 X 秒,则终止它?

bash

6
推荐指数
1
解决办法
334
查看次数

youtube-dl 更改 %(upload_date)s 的格式输出

我一直在使用upload_date文件名使用 youtube-dl 下载视频。这会将 YYYYMMDD 格式的日期放在名称文件中,但如果我可以将它们存储在以下内容中,我会发现更方便:

  • YYYY-MM-DD
  • DD-MM-YYYY

我知道 youtube-dl 不提供该选项,但是有没有其他方法可以做到这一点(在 Linux 或 Windows 上)?我唯一能想到的是在下载每个文件后使用mmv进行大规模重命名。

现在我使用输出模板:

"%(upload_date)s-%(title)s.%(ext)s"
Run Code Online (Sandbox Code Playgroud)

bash batch youtube-dl

6
推荐指数
1
解决办法
4892
查看次数

在 Bash 中将文本动态附加到文件名

我有以下for循环来单独处理sort文件夹内的所有文本文件(即为每个文件生成一个排序的输出文件)。

for file in *.txt; 
do
   printf 'Processing %s\n' "$file"
   LC_ALL=C sort -u "$file" > "./${file}_sorted"  
done
Run Code Online (Sandbox Code Playgroud)

这几乎是完美的,除了它当前以以下格式输出文件:

originalfile.txt_sorted
Run Code Online (Sandbox Code Playgroud)

...而我希望它以以下格式输出文件:

originalfile_sorted.txt 
Run Code Online (Sandbox Code Playgroud)

这是因为该${file}变量包含文件名,包括扩展名。我在 Windows 上运行 Cygwin。我不确定这在真正的 Linux 环境中会如何表现,但在 Windows 中,这种扩展名的转换会使 Windows 资源管理器无法访问该文件。

如何将文件名与扩展名分开,以便我可以_sorted在两者之间添加后缀,从而轻松区分文件的原始版本和排序版本,同时仍保持 Windows 的文件扩展名不变?

我一直在看什么或许可能的解决方案,但对我来说,这些似乎更配备以处理更复杂的问题。更重要的是,以我目前的bash知识,它们超出了我的头脑,所以我希望有一个更简单的解决方案适用于我的简陋for循环,或者有人可以解释如何将这些解决方案应用于我的情况。

windows cygwin bash filenames bash-scripting

6
推荐指数
1
解决办法
5453
查看次数

在bash中使用printf转义连字符(--)

我有以下几行:

printf "---- %.55s\n" "$1 --------------"
Run Code Online (Sandbox Code Playgroud)

当我在 bash 下运行它时,出现以下错误:

printf: --: 无效选项 printf: 用法: printf [-v var] 格式 [参数]

这是因为(我认为) printf 将字符串“----”解释为参数的开头。我试图使用“\”来逃避这个,就像这样:

printf "\---- %.55s\n" "$1 --------------"
Run Code Online (Sandbox Code Playgroud)

结果如下:

\---- content of $1 -------

如您所见,“\”成为输出的一部分,这不是我想要的。

所以问题是,我怎样才能说服 printf 我不想传递一个长论点

bash

6
推荐指数
1
解决办法
2272
查看次数

在 Cygwin 中创建的文件具有损坏的 Windows 安全设置

在一台 Windows 10 PC 上,当我从 Cygwin bash shell 创建文件时,该文件的 Windows 安全设置已损坏。

那么,例如,如果我输入echo test > test.txt,当我调出“属性”时?在 Windows 中的“安全”选项卡中,我收到以下错误消息:“test.txt 上的权限排序不正确,这可能导致某些条目无效”,并且(除其他问题外)我在“组或用户名”中看到” 列表框“NULL SID”。当我点击“高级”按钮时,我会看到几个“拒绝”类型的组条目。无论我如何创建文件,这似乎都会发生。我已经尝试过vi并且bzip2遇到了同样的问题。

这是一个本地 NTFS 硬盘驱动器。文件夹权限正确,我是 PC 上的本地管理员。

我有另一台装有 Cygwin 的 Windows 10 PC,运行相同的 bash 脚本,并且运行良好。

cygwin bash shell file-permissions windows-10

6
推荐指数
1
解决办法
1540
查看次数

为什么 Bash 为我的 PATH 中的程序提供“没有这样的文件或目录”?

docker-compose按照https://docs.docker.com/compose/install/上的说明安装在我的 Ubuntu 16.04 机器上,用于curl将二进制文件直接下载到/usr/local/bin/

$ ls -lh /usr/local/bin/docker-compose 
-rwxr-xr-x 1 root root 16M Jul 11 15:55 /usr/local/bin/docker-compose
Run Code Online (Sandbox Code Playgroud)

/usr/local/bin/ 在我的路径中:

$ echo $PATH
/home/me/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Run Code Online (Sandbox Code Playgroud)

请注意,它/usr/bin实际上是在 之前。

当我尝试检查它的版本时,我得到了一个与 PATH 相关的错误:

$ docker-compose --version
bash: /usr/bin/docker-compose: No such file or directory
Run Code Online (Sandbox Code Playgroud)

通过指定可执行文件的完整路径,我得到了正确的行为,

$ /usr/local/bin/docker-compose --version
Run Code Online (Sandbox Code Playgroud)

docker-compose 版本 1.24.0,构建 0aa59064

或通过使用sudo

$ sudo docker-compose --version
docker-compose version 1.24.0, build 0aa59064
Run Code Online (Sandbox Code Playgroud)

为什么我不能跑$ docker-compose --version?为什么 Bash 会/usr/bin特别抱怨,什么时候它应该在/usr/local/bin.

可能与我之前 …

linux bash path

6
推荐指数
1
解决办法
4853
查看次数