假设我有一个程序food
可以创建如下/bin/
文件:dinner.txt
#!/bin/bash
touch dinner.txt
我想使用我的程序在我的文件夹中food
创建而不先调用。换句话说,我想像从 调用它一样进行调用。我该怎么做?dinner.txt
/home/
cd /home/
food
/home/
编辑:假设我无法编辑实际的food
程序。
答案1
(cd ~ && /bin/food)
这会在子 shell 中启动它。
答案2
答案是也许。我能想到三种可能性。
1) 食品程序有一个允许指定输出文件的选项。约定通常(但并非总是)是一种-o outputfile
选择。运行man food
或尝试/bin/food -h
可能会显示可用的选项。
2) 食品计划有一个写入选项SDTOUT
。如果是这样的话,那么你可以运行/bin/food <whatever option writes to STDOUT> > /home/dinner.txt
。
food
3)程序运行后移动dinner.txt 文件。例如food; mv dinner.txt /home
。
了解您为什么不想跑步会很有帮助cd
。运行cd /home; food; cd -
将运行程序home
并将目录更改回food
命令运行之前的目录。
答案3
你不能编辑food
程序,但你可以编写一个新eats
程序吗?
#!/bin/bash
cd "${@}"
food
你可以吗
sudo mv /bin/food /bin/oldfood
sudo mv /bin/eats /bin/food
并更改 /bin/food 来调用 oldfood
答案4
编辑:
假设您无法更改程序的代码,您可以编写一个简短的包装脚本,它将export
food.sh
作为全局变量,然后执行它。
而且,如果您想从此脚本中完全删除目录依赖性,您还可以导出包装器脚本。这将允许您从此会话中的任何路径运行脚本shell
,并始终在下面获取输出文件/home/
包装脚本wrapper_food.sh
:
#!/bin/bash
export mkfood="/home/shadowme/mkfood.sh"
cd /home/shadowe/testdir/
$mkfood
输出:
$ ls testdir
food.0.txt
导出包装脚本:
$ export wrapper_food=/home/shadowe/wrapperfood.sh
然后您可以从同一 shell 中的任何位置调用上面的脚本:
$ $wrapper_food
原答案:
一般来说,cd /home/
之前我会想到三种避免的方法touch
:
touch
使用创建位置的完整目录路径进行调用food.txt
- 将目录路径存储为变量,然后将其组合在
touch
sh
调用脚本时将目录路径作为参数传递。
人们可以根据用例选择上述每一项。例如,如果我想始终在同一目录中创建文件,我将不会使用参数选项,因为它的输入较长。相反,我会将路径存储为变量。
下面的脚本按照提到的顺序提供了上述各项的示例。
输入:
$ ./mkfood.sh /home/shadowe/testdir
输出:
$ ls /home/shadowe/testdir
food1.txt food2.txt food.txt
脚本:
#!/bin/bash
# store path as variable
dir_path="/home/shadowe/testdir"
touch $dir_path/food.txt
#direct path
touch /home/shadowe/testdir/food1.txt
# argument pass
touch $1/food2.txt
最后,即使没有询问,也可以通过将参数命令更改为 来传递要创建的文件名作为参数touch $1/$2
。例如:
$ ./mkfood.sh /home/shadowe/testdir food2.txt