【问题标题】:Is it possible to retrieve the name of a file from redirection?是否可以从重定向中检索文件名?
【发布时间】:2011-11-06 18:14:49
【问题描述】:

我正在做一些基本的文件操作,并想存储传递给可执行 C 程序的文件名并创建一个新文件,该文件的扩展名附加在原始文件名上。例如,如果这是我在命令行中输入的内容:

a.out < some_file.txt

a.out 是一个可执行文件,有没有办法获取字符串some_file.txt,这样我就可以打开一个新文件并将其命名为some_file.text.mod 或其他名称?

argv[0] 为您提供a.out,在脚本中您可以使用$1 访问参数(但不能访问重定向中使用的文件名),但这些都不是这里的用处。

有什么想法吗?

【问题讨论】:

  • 使用重定向到文件的输入调用的 shell 脚本,没有其他参数将在 $1 中为您提供任何内容。
  • 很好,现在编辑。

标签: c file stdin


【解决方案1】:

在某些平台上是可能的,使用平台特定的结构。

例如在 linux 上,您可以在 /proc/self/fd/0 上调用 readlink()

其他形式的重定向不会提供对文件名的访问,可能没有文件 - 数据可能通过管道提供。

对于您的情况,在输入通过标准输入重定向的情况下,您最好让用户决定输出文件名

【讨论】:

  • 感谢您的快速回复。我没有考虑过它可能不是文件的其他情况,尽管现在这不容易实现,但这是有道理的。
【解决方案2】:

有时(实际上几乎总是)/proc/self/fd/0 可能是文件的符号链接。 (但符号链接可能很糟糕,例如对于管道,这是特定于 Linux 的)。

因此,您可以在 a.out 内部调用 readlink(2) 系统调用 /proc/self/fd/0

但是这样做有点恶心。但是它有效:

% ls -l /proc/self/fd/0 < ~/.zshrc
lr-x------ 1 basile basile 64 Nov  6 19:22 /proc/self/fd/0 -> /home/basile/.zshrc

% date | ls -l /proc/self/fd/0
lr-x------ 1 basile basile 64 Nov  6 19:23 /proc/self/fd/0 -> pipe:[599869]

同样,它高度特定于 Linux,不能移植到其他 Posix 系统。

【讨论】:

  • 哎呀!太乱了,我想我会想出另一种方法来命名这个文件。谢谢这么详细的回复!
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多