2012-07-12 5 views
1

Мне нужно записать выполнение некоторой команды в файле bash и игнорировать входы.Нужно перенаправить вывод на/dev/null .... отлично работает в командной строке, но не в оболочке

Пример

pvs --noheadings -o pv_name,vg_name,vg_size 2> /dev/null 

Эта команда отлично работает в командной строке, но когда я пишу то же самое в оболочке, он дает мне ошибку

как

Failed to read physical volume "2>" 
Failed to read physical volume "/dev/null" 

Я предполагаю, что это выглядит как часть всей команды. Не могли бы вы дать мне несколько советов о том, как исправить это?

Заранее спасибо.

FULLCODE

# ------------------------------

main() { 
    pv_cmd='pvs' 
    nh='--noheadings' 
    sp=' ' 
    op='-o' 
    vgn='vg_name' 
    pvn='pv_name' 
    pvz='pv_size' 
    cm=',' 
    tonull=' 2 > /dev/null ' 
    pipe='|' 

    #cmd=$pv_cmd$sp$nh$sp$op$sp$vgn$cm$pvn$cm$pvz$sp$pipe$tonull #line A 
    cmd='pvs --noheadings -o vg_name,pv_name,pv_size 2> /dev/null' #line B 
    echo -n "Cmd=" 
    echo $cmd 
    $cmd 

}

основная информация

# ------------------------------------------ -----------

Если вы посмотрите на линию A & B bot ч версии есть, хотя один закомментирована .....

+1

какая у вас раковина? это, вероятно, не bash ... –

+1

Под «в оболочке», вы имеете в виду в файле сценария? Если да, пожалуйста, укажите * точную копию соответствующей части вашего скрипта. – chepner

+0

его файл bash .... да ... filename is main.sh и shabang is!/Bin/bash – howtechstuffworks

ответ

2

Вы не можете включать в себя 2>/Dev/нуль внутри строки в кавычках. Цитата удаление происходит после перенаправления обрабатываются. Вам нужно будет сделать

cmd='pvs --noheadings -o vg_name,pv_name,pv_size' 
$cmd 2> /dev/null 

для правильного его перенаправления.

+1

Это по-прежнему очень плохая практика - 'cmd = (cvs --noheadings -o vg_name, pv_size, pv_size); «$ {cmd [@]}« 2>/dev/null »будет эквивалентом, который работает с аргументами, содержащими пробельные символы, если действительно существует причина для создания команды в переменной, подобной этой. См. Http://mywiki.wooledge.org/BashFAQ/050 –

+0

Согласовано; Я остановился на минимальном изменении, чтобы избежать данной ошибки. – chepner

-1

устранить пространство между 2 и>

pvs --noheadings -o pv_name,vg_name,vg_size 2>/dev/null 
+0

Я сделал это, он дал мне – howtechstuffworks

+0

Не удалось прочитать физический том «2>/dev/null» – howtechstuffworks

0

Я думаю, что происходит то, что в строке есть какой-то символ, который либо не виден нам, либо > - это другой символ, чем он появляется. После того, как оболочка должна проглотить перенаправление до того, как команда ее увидит, команда видит 2> и /dev/null как [PhysicalVolume [PhysicalVolume...]]. В качестве альтернативы перенаправление может быть передано в кавычки (таким образом, он теряет особый смысл для оболочки и получает передачу), см. Ответ chepner.


tonull=' 2 > /dev/null ' 

является проблемой. Точно, как догадывался чепнер.

+0

На самом деле это не устройство. Если вы делаете man pvs, вы увидите «pvs --noheadings -o pv_name, pv_size, vg_name », он думает, что это устройства .... пожалуйста, помогите //// – howtechstuffworks

+0

@chepner: Я заметил и исправил свой ответ. – 0xC0000022L

1

Как вы это сделали, 2> и/dev/null будут проанализированы как аргументы. Но вы хотите 2>/DEV/нуль, чтобы быть Баш код, а не программа аргумент, так

вместо

$cmd 

вы должны

eval $cmd 

Вот как это работает.

Или, если эхо-вещь предназначена для отладки, вы можете просто установить -o xtrace перед командой и установить после нее + o. И делайте это обычным способом, а не набивая строку.

 Смежные вопросы

  • Нет связанных вопросов^_^