如何通过Linux的Shell学习

12

我希望在处理Linux/Unix的shell时不再浪费宝贵的时间。

如果我能够深入理解它,那就太好了。否则:

  • 我可能会花一整天的时间来设置一个crontab。
  • 我会一直疑惑为什么这个脚本中的shebang不起作用。
  • 我会一直想知道以下命令之间的真正区别:
    • . run.sh
    • ./run.sh
    • . ./run.sh
    • sh run.sh
    • sh ./run.sh

你看,正是这些事情使我的Linux/Unix生活不畅。

作为一名程序员,我希望在这方面变得更加娴熟。我想最好还是使用广泛使用的bash shell,但我可能是错的。无论用什么工具,我都需要了解它的内部机制。

什么是最终解决方案?

11个回答

15

只是为了娱乐:

  1. . run.sh --- 在当前shell中"Source"运行run.sh的代码。通常,这用于将环境变量导入当前shell进程中。对于名为run.sh的脚本,您可能不需要这样做。

  2. ./run.sh --- 在当前目录中执行run.sh脚本。通常,当前目录不在默认路径(请参见$PATH),因此您需要显式调用相对位置。与第1项中使用的.字符不同。

  3. . ./run.sh --- 在当前目录中"Source"运行run.sh脚本。这将结合使用第1项和第2项中的.

  4. sh run.sh --- 对run.sh使用sh shell解释器。Bourne shell通常是运行shell脚本的默认选项,因此这与第2项可能相同,只是它会在$PATH中查找第一个run.sh而不是当前目录中的脚本。

  5. sh ./run.sh --- 通常与#2相同,只是表述更繁琐。

命令行界面(例如各种shell解释器)通常非常晦涩,因为它们需要在少数字符中包含大量含义。否则,打字就太耗时间了。

在学习方面,我建议使用bashksh,并且在您感到自在之前不要让任何人劝您尝试其他的。请不要使用csh进行学习,否则当您以后开始使用Bourne类型的shell时,需要放弃太多先前学到的内容。

此外,crontab 条目比其他 shell 使用方式要棘手一些。我猜测你花费的时间是因为你的环境设置与命令行不同。如果可能的话,建议从其他地方开始。


12

Man页面可能是“终极解决方案”。我总是很惊讶它们包含了哪些珍宝。

你甚至可以使用man bash来回答你在这个问题中提出的一些问题。


2
是的,我曾经经常使用谷歌来查找这些内容......直到我意识到 Bash 的 man 手册是一个非常有用的信息宝库,所有信息都在一个方便的地方。 - mipadi
2
几乎所有东西的man页面都是权威文档...当我第一次转换到Linux时,我花了一段时间才意识到这一点。 - rmeador
2
对于GNU工具而言,info页面通常比man页面更好,因为GNU通常不喜欢man页面(我认为是因为它们的格式是专有的)。只需执行“info coreutils”。 “info bash”也比man页面提供了更结构化的输出。非常推荐! - Johannes Schaub - litb
2
@litb:我非常不喜欢信息页面。问题的一部分是,我发现浏览一个大页面比一堆小页面更容易。但我想每个人都有自己的喜好。 - Jon Ericson
1
我记得,man页面的格式是troff,这是一种晦涩但不是专有的格式。 - David Thornley
显示剩余3条评论

3
尝试使用Linux文档项目的BASH页面这里[tldp.org]
PS:区别在于“.”与“source”命令相同,只需要读取权限。要使用./run.sh,您需要执行权限。当您使用“sh”时,您明确指定要使用的命令来运行脚本(在这里,您只需要读取权限)。如果您正在使用shell来执行它,则不应该有问题。如果您想使用其他程序(例如“python”),可以使用python run.py。另一个技巧是在脚本开头添加一行#!<program>。在您的情况下,#!/bin/sh就可以了,而对于Python,最好使用#/usr/bin/env python

2

我认为沉浸在其中是答案。就像学走路、打字、使用人体工程学键盘或Dvorak键盘一样。完全投入其中。是的,你肯定会变慢。你将不得不经常看手或谷歌事物。但最终你会掌握它。

有个有趣的故事,我通过执行ifconfig release命令杀死了我的公寓互联网接入。完全不知道ifconfig renew不是一个命令。当谷歌无法加载时,我不得不打电话给朋友;)稍后通过dhcpcd,我又可以随便谷歌了。


2
Oreily出版社有一本旧书,教你如何使用bash和在末尾进行bash脚本编写。你需要了解的大部分内容都可以在网上找到,但是分散在各个地方。

根据titlez.com的数据,这本书仍然是亚马逊上畅销的Bash Shell书籍。谢谢! - Daniel Jomphe
1
@Danial:不客气。我有第二版修订稿。我是一位经验丰富的Linux用户,有时仍会使用它来寻找答案。 - J.J.

1
学习的最佳方式是阅读,然后尝试实践。MAN页面通常非常有帮助,而且有大量的Shell脚本教程可供选择。如果你想学习Shell脚本编程,只需阅读并通过编写一些有趣或有用的小脚本来练习所学内容。如果你想了解可以从Shell运行的所有不同命令行应用程序的更多信息,这些应用程序更依赖于发行版,因此请查看您喜欢的发行版的文档。

1

经常使用命令行,频繁输入"[prog-name] --help",频繁输入"man [prog-name]",并记录下哪些操作有效,哪些无效——即使这些记录在当时似乎显而易见。明天,它们可能就不再那么明显了。另一方面,在几周后,它们肯定应该变得明显起来!

看看一些关于命令行的书籍,比如《从Bash到Z Shell》(涵盖Bash和Z Shell),或者参考一个shell脚本教程,或者GNU的Bash手册


1

有一些不错的在线指南可以帮助您更加熟悉Shell。例如:

花些时间阅读这些类型的教程,最重要的是在 shell 中进行实践。很快,它会开始感觉像 $HOME 一样。(好吧,抱歉这个糟糕的双关语...)

1

在学习时,坚持使用Bash可能是最好的选择,但fish shell可能会更容易使用一些。我尝试了几周,虽然它似乎没有Bash那么强大,但它确实非常用户友好。


我几个月前尝试过fish,非常喜欢它。可惜它并不适合我的需求。当我更加熟悉bash并更加专注于使用shell时,也许我会再次尝试。我只是不想为每个bash已经有脚本的工具编写脚本。 - Daniel Jomphe

0

我真正学会在Linux中操作的方法是安装gentoo。虽然需要很长时间,但你开始看到所有东西是如何联系在一起的。

去获取最新的指南并开始跟随它们。多做几次,就会开始记住了。

过一段时间后,你会变得很熟悉从头开始构建所有东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接