Symbolische Links mittels Skript erzeugen



  • Hallo,

    ich möchte symbolische Links von den Boost-Libraries anlegen, deren Namen nicht mehr die Version von Boost und gcc enthalten. Ich habe allerdings Probleme mit sed:

    #!/bin/bash
    
    targets=$(ls ./boost/lib/libboost_*-gcc??-mt-?_??.so)
    for i in $targets; do
       echo "$i"
       sed -n "s/a/A/g" ${i} > ${i} 
       echo "$i"
    done
    

    Das angegebene Skript soll die Namen der Boost-Library-Files ausgeben, einmal so wie sie sind, einmal mit 'a' durch 'A' ersetzt (das entspricht nicht dem, was das Skript am Ende machen soll, aber sowas müsste ich wohl erstmal hinkriegen).

    Die Ausgabe sieht aber wie folgt aus:

    ./boost/lib/libboost_date_time-gcc41-mt-1_35.so
    ./boost/lib/libboost_date_time-gcc41-mt-1_35.so
    ./boost/lib/libboost_filesystem-gcc41-mt-1_35.so
    ./boost/lib/libboost_filesystem-gcc41-mt-1_35.so
    ./boost/lib/libboost_graph-gcc41-mt-1_35.so
    ./boost/lib/libboost_graph-gcc41-mt-1_35.so
    ./boost/lib/libboost_iostreams-gcc41-mt-1_35.so
    ./boost/lib/libboost_iostreams-gcc41-mt-1_35.so
    ./boost/lib/libboost_prg_exec_monitor-gcc41-mt-1_35.so
    ./boost/lib/libboost_prg_exec_monitor-gcc41-mt-1_35.so
    ./boost/lib/libboost_program_options-gcc41-mt-1_35.so
    ./boost/lib/libboost_program_options-gcc41-mt-1_35.so
    ./boost/lib/libboost_python-gcc41-mt-1_35.so
    ./boost/lib/libboost_python-gcc41-mt-1_35.so
    ./boost/lib/libboost_regex-gcc41-mt-1_35.so
    ./boost/lib/libboost_regex-gcc41-mt-1_35.so
    ./boost/lib/libboost_serialization-gcc41-mt-1_35.so
    ./boost/lib/libboost_serialization-gcc41-mt-1_35.so
    ./boost/lib/libboost_signals-gcc41-mt-1_35.so
    ./boost/lib/libboost_signals-gcc41-mt-1_35.so
    ./boost/lib/libboost_system-gcc41-mt-1_35.so
    ./boost/lib/libboost_system-gcc41-mt-1_35.so
    ./boost/lib/libboost_thread-gcc41-mt-1_35.so
    ./boost/lib/libboost_thread-gcc41-mt-1_35.so
    ./boost/lib/libboost_unit_test_framework-gcc41-mt-1_35.so
    ./boost/lib/libboost_unit_test_framework-gcc41-mt-1_35.so
    ./boost/lib/libboost_wave-gcc41-mt-1_35.so
    ./boost/lib/libboost_wave-gcc41-mt-1_35.so
    ./boost/lib/libboost_wserialization-gcc41-mt-1_35.so
    ./boost/lib/libboost_wserialization-gcc41-mt-1_35.so
    

    D.h. sed bewirkt nichts.

    Weiss jemand warum?



  • wieso rufst Du sed mit -n auf ?



  • ingobulla schrieb:

    targets=$(ls ./boost/lib/libboost_*-gcc??-mt-?_??.so)
    

    Hier liegt zwar noch nicht dein Problem, aber das ls ist überflüssig:

    targets=./boost/lib/libboost_*-gcc??-mt-?_??.so
    

    Und ganz nebenbei funktioniert das so nicht für boost 1.34.1 😉

    ingobulla schrieb:

    sed -n "s/a/A/g" ${i} > ${i}
    

    Autsch!

    Du liest und schreibst hier nicht die Variable $i, sondern die Datei mit Namen $i! Da die Shell bereits die leere Datei für die Ausgabe anlegt, bevor sed überhaupt anfängt zu arbeiten, liest sed also eine leere Datei, und du hast gerade alle deine Boost-Libraries auf Größe Null reduziert...
    Ach ja, und mit dem -n würde sed in der Form sowieso nichts ausgeben.

    So sollte die Zeile funktionieren:

    i=$(echo $i | sed "s/a/A/g")
    

Anmelden zum Antworten