过滤后如何使用C程序的二进制文件?

时间:2018-06-24 01:21:08

标签: bash shell

我编写了一个程序,该程序从文件或stdin读取输入,进行排序并将其写入输出文件或stdout。我希望能够像所有类似过滤器的程序(grep,tr,sed)一样使用二进制文件。

例如:我希望能够输入类似“ cat myfile.txt | myfilter --action sort> myoutputfile”的内容,而不是cat myfile.txt | ./myfilter-操作排序> myoutputfile。

2 个答案:

答案 0 :(得分:2)

您似乎正在使用某种* nix系统。因此,您需要做的是将二进制文件放入环境PATH中的目录中。在我的系统上,它看起来像这样:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

所以要么将二进制文件放入其中之一,要么将额外的目录添加到PATH

假设Linux系统(也可以在BSD或Mac上运行),则编辑文件~/.bashrc并添加行export PATH="<your/custom/path>:$PATH"。请注意,编辑.bashrc该文件只会对当前用户执行此操作。

如果要使所有用户都可以使用特定的可执行文件,则不要在主目录中创建bin目录,而是将其添加到/ usr。例如,mkdir /usr/mybin并编辑/etc/profile而不是~/.bashrc。我的文件包含以下几行:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

添加行PATH="/usr/mybin:$PATH",您将得到:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
PATH="/usr/mybin:$PATH
export PATH

使用这种方法,您将使/usr/mybin出现在所有用户路径中。确保目录和可执行文件具有正确的权限。使用命令chmod 755 /usr/mybinchmod 755 /usr/mybin/filter。另一种选择是将文件放在路径中已经存在的目录中,例如/usr/bin。但是您仍然需要确保它具有755权限。

答案 1 :(得分:1)

从声音上看,您在Linux机器上,所以我将使用它作为答案

首先,您将要创建一个新文件夹:

#include <tuple> #include <utility> #include <iostream> #include <type_traits> template <typename F, typename ... Ts> constexpr auto numArgsH (int, Ts ... ts) -> decltype( std::declval<F>()(ts...), std::size_t{} ) { return sizeof...(Ts); } template <typename F, typename ... Ts> constexpr auto numArgsH (long, Ts ... ts) { return numArgsH<F>(0, 0, ts...); } template <typename F> constexpr auto numArgs () { return numArgsH<F>(0); } template <std::size_t I, typename F, std::size_t ... Js, typename ... Ts> void apply_on_each_h2 (F func, std::index_sequence<Js...> const & js, std::tuple<Ts...> const & t) { func(std::get<I*sizeof...(Js)+Js>(t)...); } template <typename F, std::size_t ... Is, std::size_t ... Js, typename ... Ts> void apply_on_each_h1 (F func, std::index_sequence<Is...> const &, std::index_sequence<Js...> const & js, std::tuple<Ts...> const & t) { (apply_on_each_h2<Is>(func, js, t), ...) ; } template <typename F, typename ... Ts> void apply_on_each (F func, Ts ... ts) { static constexpr auto num_args { numArgs<F>() }; apply_on_each_h1(func, std::make_index_sequence<sizeof...(Ts)/num_args>{}, std::make_index_sequence<num_args>{}, std::make_tuple(ts...)); } int main() { auto l1 = [](auto a) { std::cout << "- l1:" << a << std::endl; }; auto l2 = [](auto a, auto b) { std::cout << "- l2:" << a << ", " << b << std::endl; }; auto l3 = [](auto a, auto b, auto c) { std::cout << "- l3:" << a << ", " << b << ", " << c << std::endl; }; apply_on_each(l1, 1, 2l, 3ll, "4", '5', 6.0); apply_on_each(l2, 1, 2l, 3ll, "4", '5', 6.0); apply_on_each(l3, 1, 2l, 3ll, "4", '5', 6.0); }

之后,您需要将新文件夹添加到$ mkdir ~/bin

path

下一部分可能会有所不同,具体取决于您要执行的操作。由于它是您自己的个人二进制文件,因此将二进制文件添加到文件夹中可能会更容易。否则,您可以创建指向文件的符号链接。

要创建符号链接:

$ nano ~/.bashrc
# Add the following to the end of your ~/.bashrc file while using nano
# or your text editor of choice:
export PATH="/home/$USER/bin:$PATH"

将文件移到bin文件夹

$ ln -sf ~/path/to/filter ~/bin/filter

最后,选择了方法(并且可以从$ mv ~/path/to/filter ~/bin 文件夹访问可执行文件后,运行以下命令:

请注意,~/bin/仅用于刷新当前的终端会话,您不必再次执行此操作

source