我想在Linux中创建一个符号链接。我编写了这个Bash命令,其中第一个路径是我想要链接到的文件夹,第二个路径是编译的源代码。
ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal
这是正确的吗?
我想在Linux中创建一个符号链接。我编写了这个Bash命令,其中第一个路径是我想要链接到的文件夹,第二个路径是编译的源代码。
ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal
这是正确的吗?
当前回答
这是堆栈溢出,所以我假设您需要代码:
以下所有代码都假定您希望创建一个名为/tmp/link的符号链接,该链接链接到/tmp/realfile。
注意:虽然此代码检查错误,但它不会检查/tmp/realfile是否确实存在!这是因为死链接仍然有效,根据您的代码,您可能(很少)希望在真实文件之前创建链接。
外壳(bash、zsh…)
#!/bin/sh
ln -s /tmp/realfile /tmp/link
非常简单,就像您在命令行(即shell)上做的那样。所有错误处理都由shell解释器完成。这段代码假设您在/bin/sh有一个工作的shell解释器。
如果需要,您仍然可以使用$?变量,只有在成功创建链接时才会设置为0。
C和C++
#include <unistd.h>
#include <stdio.h>
int main () {
if( symlink("/tmp/realfile", "/tmp/link") != 0 )
perror("Can't create the symlink");
}
symlink仅在可以创建链接时返回0。在其他情况下,我使用perror来讲述更多的问题。
Perl
#!/usr/bin/perl
if( symlink("/tmp/realfile", "/tmp/link") != 1) {
print STDERR "Can't create the symlink: $!\n"
}
这段代码假设您在/usr/bin/perl上有一个perl5解释器。如果可以创建链接,symlink只返回1。在其他情况下,我会将失败原因打印到标准错误输出中。
其他回答
ln -s target linkName
您可以在此处查看手册页:
http://linux.die.net/man/1/ln
我想介绍一个更简单的英文版本的描述。
ln -s /path-text/of-symbolic-link /path/to/file-to-hold-that-text
“ln”命令创建一个链接FILE,“-s”指定链接类型为符号。符号链接文件的示例可以在WINE安装中找到(使用“ls-la”显示一行目录内容):
lrwxrwxrwx 1 me power 11 Jan 1 00:01 a: -> /mnt/floppy
标准文件信息在左边(尽管注意第一个字符是“链接”的“l”);文件名为“a:”,“->”也表示该文件是一个链接。它基本上告诉了WINE Windows“驱动器A:”如何与Linux中的软盘驱动器相关联。要实际创建一个符号链接SIMILAR(在当前目录中,并为WINE实际创建此链接更为复杂;请使用“winecfg”实用程序):
ln -s /mnt/floppy a: //will not work if file a: already exists
(因为一张ASCII图片值一千个字符。)
箭头可能是一种有用的助记符,尤其是因为在Emacs的目录中,箭头几乎就是这样的。
而且要有大局观,这样你就不会与Windows版本混淆
Linux:
ln -s target <- linkName
窗户:
mklink linkName -> target
您也可以将这些视为
ln -s "to-here" <- "from-here"
mklink "from-here" -> "to-here"
from here应该还不存在,它将被创建,而to here应该已经存在(IIRC)。
(我总是搞不清楚各种命令和参数是应该涉及预先存在的位置,还是应该生成的位置。)
编辑:对我来说,它仍在慢慢下沉;我还有另外一种方式写笔记。
ln -s (target exists) (link is made)
mklink (link is made) (target exists)
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME
对于原问题:
'ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal'
这确实会从文件/目录创建一个符号链接(-s):
<basebuild>/IpDome-kernel/kernel
到您的新链接
/home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal
以下是一些帮助您记住的方法:
首先,这是ln的手册页。你可以通过在谷歌中搜索“man ln”来访问它,或者只需打开一个终端窗口并键入man ln,你就会得到相同的信息。手册页明确说明:
ln[选项]。。。[-T]TARGET LINK_NAME(第一种格式)
如果每次都要搜索或阅读手册页不适合你,也许你会更容易记住所有nix命令的工作方式:
cp /file/that/exists /location/for/new/file
mv /file/that/exists /location/its/moving/to
ln /file/that/exists /the/new/link
cp将当前存在的文件(第一个参数)复制到新文件(第二个参数)。mv将当前存在的文件(第一个参数)移动到新位置(第二个参数)同样,ln将当前存在的文件(第一个参数)链接到新链接(第二个参数)*
我想建议的最后一个选项是,您可以创建自己的手册页,这些手册页易于阅读,并且易于查找/记忆。只需制作一个简单的shell脚本,即可提供所需的提示。例如♦:
在.bash_aliases文件中,可以放置以下内容:
commandsfx() {
echo "Symlink: ln -s /path/to/file /path/to/symlink"
echo "Copy: cp /file/to/copy /destination/to/send/copy"
}
alias 'cmds'=commandsfx
然后,当您需要时,只需在命令行中键入cmds,就可以以快速阅读和理解的方式返回正确的语法。您可以使这些函数尽可能高级,以获得所需的信息,这取决于您。你甚至可以让它们交互,所以你只需要按照提示操作。。类似于:
makesymlink() {
echo "Symlink name:"
read sym
echo "File to link to:"
read fil
ln -s $fil $sym
}
alias 'symlink'=makesymlink
*-很明显,它们都可以采用不同的参数,做不同的事情,可以处理文件和目录。。。但前提是一样的♦ - 使用bashshell的示例