我编写了一个程序,该程序从文件或stdin读取输入,进行排序并将其写入输出文件或stdout。我希望能够像所有类似过滤器的程序(grep,tr,sed)一样使用二进制文件。
例如:我希望能够输入类似“ cat myfile.txt | myfilter --action sort> myoutputfile”的内容,而不是cat myfile.txt | ./myfilter-操作排序> myoutputfile。
答案 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/mybin
和chmod 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