2015-08-13 3 views
0

Is можно написать сценарий ./inplace оболочки, которая работает как следующим образом:"Inplace" обертка для оболочки команды

./inplace arg1 arg2 [..] argn 

должна быть эквивалентна последовательности:

arg1 arg2 [..] argn > tmp.file 
mv tmp.file argn 

Для трех аргументов:

./inplace arg1 arg2 arg3 

должно работать как

arg1 arg2 arg3 > tmp.file 
mv tmp.file arg3 

Мои попытки не подходят для случаев с аргументами, связанными с $1. Для например

./inplace awk '{print $1}' file.txt 

Update:

Это работает (после ответа от Томаса Дики)

#!/bin/sh 

for last; do true; done 

"[email protected]" > tmp.file 
mv tmp.file "${last}" 

# Examples: 
# 
# seq 20 > test.txt 
# ./inplace.sh head test.txt 
# cat test.txt 
# 
# seq 20 > test.txt 
# ./inplace.sh awk '{print $1^2}' test.txt 
# cat test.txt 
# 
# seq 20 > test.txt 
# ./inplace.sh awk -v line="with spaces:" '{print line, $1}' test.txt 
# cat test.txt 
# 

ответ

2

Вероятно, проблема заключается в отсутствии кавычек. Если вы используете специальный параметр "[email protected]" в сценарии inplace (вместо, например, $*), он будет указывать все параметры.