主持人:这不是重复!!!!请删除重复标记。
链接到的答案实际上并没有像公认的答案那样回答我的问题。谷歌只指出其他答案,这些答案实际上并不是这个特定问题的答案。
当跟随一个指向目录的符号链接时,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()系统调用的物理输出;那些问题根本不谈这个。
我要将我的 root 的默认 shell 从 bash 更改为 fish。据我所知,fish 不是 POSIX 标准外壳。另一方面,可能系统中的内核或其他东西与 POSIX 标准有关系,因此不建议将 root 的默认 shell 设置为非 POSIX 的 shell,因为这可能会导致操作系统的某些部分出现问题。我看到有人在某些主题上建议其他人不要将 root 用户的默认 shell 设置为非 POSIX 的 shell!这样对吗?
我是否应该将 root 的默认 shell 更改为非 POSIX 的 shell?(如果你能解释清楚,我会很高兴,我是类 Unix 世界的新手!)
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)
所以我想来自另一个问题的消息正是我最初的想法,在我对 …
从这个拿起高度投票评论到什么``>>意味着终端命令?:
“程序之前”是什么意思?显然是命令,但重定向也可以写在前面,即
>> file command
我不记得见过这样的案例——尽管考虑到赞成票的数量,它们显然存在。我只见过并使用过格式的重定向命令
command >> file
Run Code Online (Sandbox Code Playgroud)
当使用>>及其同类(即2>,2>&1等)。
你什么时候以及为什么要颠倒顺序?这是否意味着所有内容都stdout被重定向,而不仅仅是来自command?有谁有具体的例子吗?
我有一个谷歌,可以找到任何直接的例子。
是否可以从 bash(例如 python)运行具有终止时间的脚本,这意味着如果该脚本运行时间超过 X 秒,则终止它?
我一直在使用upload_date文件名使用 youtube-dl 下载视频。这会将 YYYYMMDD 格式的日期放在名称文件中,但如果我可以将它们存储在以下内容中,我会发现更方便:
我知道 youtube-dl 不提供该选项,但是有没有其他方法可以做到这一点(在 Linux 或 Windows 上)?我唯一能想到的是在下载每个文件后使用mmv进行大规模重命名。
现在我使用输出模板:
"%(upload_date)s-%(title)s.%(ext)s"
Run Code Online (Sandbox Code Playgroud) 我有以下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循环,或者有人可以解释如何将这些解决方案应用于我的情况。
我有以下几行:
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 我不想传递一个长论点?
在一台 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 脚本,并且运行良好。
我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.
可能与我之前 …
bash ×10
linux ×3
cygwin ×2
shell ×2
batch ×1
command-line ×1
filenames ×1
fish ×1
ordering ×1
path ×1
posix ×1
redirection ×1
windows ×1
windows-10 ×1
youtube-dl ×1