Wie erstelle ich ein neues Verzeichnis durch ein shell-Skript in Linux?
Ich versuche zu erstellen neues Verzeichnis /proj
mit Unterverzeichnissen bin, cgi, sbin, etc...
wenn /proj
existiert nicht. Jedoch, anstelle der Schaffung von mehreren Unterverzeichnissen, es schafft ein einziges Unterverzeichnis mit dem Namen {Changes...src}
#If project directory exists, then do not create a new one.
if [ -d /proj ]; then
echo "Project directory exists. New directory will not be created."
#Otherwise, create a new project directory.
else
echo "Project directory does not exist. Creating a new project directory..."
mkdir -p proj/{Changes,Makefile,bin,cgi,doc,etc,html,lib,sbin,src}
fi
Was bin ich, um die Unterverzeichnisse, die ich will?
- Welche shell benutzt du? Getestet habe ich
mkdir -p proj/{a,b,c}
in beiden/bin/csh
und/bin/bash
, und bekam das erwartete Ergebnis (alle Unterverzeichnisse wurden erstellt). - Dein script funktioniert bei mir in der bash (version4.2.42) für mich. (Ich habe noch
#!/bin/bash
und ich entfernt den Schrägstrich vor derproj
auf der Linieif [ -d proj ];
. Ich weiß nicht, ob das den Unterschied gemacht.) - Wenn Sie
printenv | grep SHELL
sollten Sie herausfinden, welche shell Sie ausführen... - Ich glaube nicht, dass das einen Unterschied macht; es ist nicht so, dass "keine Verzeichnisse" angelegt, sondern "ein einziger mit einem langen Namen". Also das problem ist definitiv mit der
mkdir
Linie. echo proj/{Changes,Makefile,bin,cgi,doc,etc,html,lib,sbin,src}
. Was ist Ihr Ausgang für diese.- Ich habe bash, version 4.1.5(1)-release(i486-pc-linux-gnu)
- & ja, es ist etwas falsch mit der
mkdir
Linie. Es funktioniert gut nackt, sondern erstellt nur ein einziges Unterverzeichnis in das shell-Skript.
Du musst angemeldet sein, um einen Kommentar abzugeben.
FYI:
Die folgenden Mittel, das Verzeichnis
proj
ist in/
.BEARBEITEN
Einer Wahrscheinlichkeit, die ich sehe ist (kann nicht wahr sein):
In den Kommentar, Ihr sagen, dass Sie sind in der Lage, erstellen Sie ein Verzeichnis mit
mkdir -p proj/{Changes,Makefile,bin,cgi,doc,etc,html,lib,sbin,src}
. Aber danach, sagen Sie, "wenn ich die cd in /proj, es ist immer noch ein einziges Unterverzeichnis". Vielleicht ist hier dein problem.Möglicherweise haben Sie bereits so ein Verzeichnis namens
/proj
.;-)if [ -d ./proj ]
, richtig? Es erklärt immer noch nicht, warum er nicht immer die Verzeichnisse erstellt, und Sie (und ich) sind...echo proj/{Changes,Makefile,bin,cgi,doc,etc,html,lib,sbin,src}
von Ihrer shell aus, und dann können Sie fügen Sie Ihre Ausgabe auf Ihre Frage?cd
in /proj, es ist noch je ein Unterverzeichnis.mkdir -p ./proj/{Changes,Makefile,bin,cgi,doc,etc,html,lib,sbin,src}
, aber nicht in shell-SkriptIch fand eine Hinweis:
"Brace-expansion wird aktiviert über den "set-B" - Befehl und dem "-B" command-line-option, um die Schale und deaktiviert via "set +B -" und "+B" auf der Kommandozeile."
Ist es möglich, dass ein anderes Skript, dass Sie ausführen (vielleicht automatisch, oder durch
.bashrc
) "deaktiviert" brace expansion? Hier sind einige tests, die ich gemacht habe:Hier ist wo es wird ein bisschen verrückt, aber... Wenn ich ein einfaches shell-Skript
testbrace-
:und führen Sie es von der Kommandozeile etwa so:
den Gegenwert Skript
testbrace+
:gibt mir
In anderen Worten, das +B flag nicht beeinträchtigt, wie das Skript ausgeführt wird. In jedem Fall, brace-expansion ist DEAKTIVIERT.
ALLERDINGS, wenn ich explizit aufrufen bash von der Kommandozeile aus mit einer fahne, ich KANN das Ergebnis beeinflussen:
Wie Sie sehen können, wird das Skript ausführen brace expansion IFF-ich nenne es mit
/bin/bash -B scriptname
- an dem Punkt, Sie ignoriert die B-flag im script. Ich erwarte, dass Sie das gleiche Ergebnis erhalten, wenn Sie verwenden Sie diese Methode für den Aufruf von Verzeichnis-Skript erstellen.Auch, stellen Sie sicher, dass die nächste Zeile zu
als mehrere Leute darauf hingewiesen.