Questo dovrebbe risolvere il problema:
./program `cat file`
Se vuoi l'intero contenuto del file in un singolo argomento, aggiungi le doppie virgolette (testato in bash. Penso che possa variare da shell a shell):
./program "`cat file`"
Comando
./program "$(< file)"
Spiegazione
-
$(cmd)
esegue un comando e converte il suo output in una stringa.$(cmd)
può anche essere scritto con apici inversi come`cmd`
. Preferisco il più recente$(cmd)
poiché nidifica meglio dei backtick della vecchia scuola. -
Il comando che vogliamo è
cat file
. E poi dalla pagina man di bash:La sostituzione del comando
$(cat file)
può essere sostituito dall'equivalente ma più veloce$(< file)
. -
Le virgolette attorno ad esso assicurano che gli spazi bianchi siano preservati, nel caso in cui ci siano spazi o nuove righe all'interno del file. Citare correttamente le cose negli script di shell è un'abilità che manca gravemente. Citare le variabili e le sostituzioni dei comandi è una buona abitudine da prendere in modo da non essere morso più tardi quando i nomi dei file o i valori delle variabili hanno spazi o caratteri di controllo o altre stranezze.
Puoi usare uno di:
./program $(cat file)
./program "$(cat file)"
Quest'ultimo è utile se ci possono essere più parole nel file e vuoi che vengano trattate come un singolo argomento. In ogni caso, preferisco usare if $()
ai backtick semplicemente per la sua capacità di nidificare (che probabilmente non è un requisito in questo caso).
Tieni inoltre presente che questa risposta (e altre) sono più correlate alla shell in uso piuttosto che a Linux stesso. Dal momento che il predominante
shell sembra essere bash
, ho codificato appositamente per questo.
Questo è in realtà un modo abbastanza comune per uccidere i processi sotto i sosia di UNIX. Un demone (come cron
) scriverà il suo ID di processo in un file (come /var/cron.pid
) e puoi segnalarlo con qualcosa come:
kill -HUP $(cat /var/cron.pid)